【发布时间】:2011-07-15 11:08:49
【问题描述】:
我正在尝试使用 WPDB 连接到 WordPress,因为它是一个非常漂亮的类,并且在 wp-config.php 中指定了一些配置,所以我不需要再次指定它。
我要从主 WordPress 中编写一个单独的小脚本,以便在需要使用此 WPDB 实例的后台运行。
我该如何存档?
感谢任何帮助。
【问题讨论】:
标签: wordpress
我正在尝试使用 WPDB 连接到 WordPress,因为它是一个非常漂亮的类,并且在 wp-config.php 中指定了一些配置,所以我不需要再次指定它。
我要从主 WordPress 中编写一个单独的小脚本,以便在需要使用此 WPDB 实例的后台运行。
我该如何存档?
感谢任何帮助。
【问题讨论】:
标签: wordpress
仅加载 WordPress 核心功能的最佳(最快和最安全)方法是使用 SHORTINIT 标志,如下所示:
define( 'SHORTINIT', true );
require( '/path/to/wp-load.php' );
//Here you can use WordPress core features, for example the $WPDB object
有关此的更多信息并查看加载的内容,请查看/wp-settings.php 中的代码。在那里你会找到以下部分:
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
return false;
这意味着在此之后的任何内容都不会被加载,并且您可以看到很多内容。占用空间将比仅加载 wp-load.php 小得多,并且仍然可以让您访问 WordPress 核心中的所有内置功能,而不像直接包括 /wp-includes/wp-db.php。 WP 核心中的许多函数在其他文件中也有依赖关系,要准确确定需要包含哪些文件才能执行您想要的操作可能会很麻烦。 SHORTINIT 包含所需的依赖项,因此您不必担心这一点。
如果你确切地知道你需要什么,例如只包含 WPDB,最快的方法当然是只包含你需要的文件,但是SHORTINIT 提供了一种更安全、更标准化的方式来加载 WP 核心和依赖项。使用SHORTINIT WordPress 不加载插件、大部分插件API、主题、主题功能以及大多数管理和前端功能。这是典型 WordPress 安装中繁重的代码所在。
在大多数情况下,我认为 SHORTINIT 值得在速度/性能上进行小幅权衡,而不是仅包含您需要的文件,并且在大多数情况下,与满载相比,它的性能提升很大。
【讨论】:
wp-settings.php 并发现:date_default_timezone_set( 'UTC' ); 很烦人。最让我担心的是,我不知道还有什么可能会受到影响。
确实SHORTINIT 似乎是最好的解决方案:请参阅@Pelmered answer...
供参考: SHORTINIT 是在 WordPress 3.0 (June 17, 2010) 中引入的,尽管在发行说明中没有提及,但 look at the code 本身提供了明确的添加指示。
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
include_once $path . '/wp-config.php';
include_once $path . '/wp-load.php';
include_once $path . '/wp-includes/wp-db.php';
include_once $path . '/wp-includes/pluggable.php';
// $wpdb is available, do stuff
【讨论】:
wp-load.php 还不够吗?
include_once()或require())时,我得到internal server error 500!。只有一个 include 或 require 适合我!
WordPress 实际上允许您使用自己的 DBA(数据库抽象层),只需创建一个名为 db.php 的文件并将其保存在 wp-content 目录的根目录中即可。
我遇到了需要通过我编写的类访问数据库的问题,这与 WordPress 无关,但我不想创建一个全新的 DBA,只使用这个脚本。
由于默认的WPDB不允许你使用工厂模式,所以我赶紧写了几行支持它,并添加到db.php...
<?php
class DB extends wpdb
{
protected static $instance = null;
public static function getInstance()
{
if (!self::$instance) {
self::$instance = new DB(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
}
return self::$instance;
}
}
$wpdb = DB::getInstance();
现在当需要从其他地方使用wpdb(在我的例子中是一个非WordPress类)时,你可以使用:
$wpdb = DB::getInstance();
来自方法内部,而不是可怕的global。
【讨论】:
Fatal error: Class 'wpdb' not found
您可以使用以下代码在主题文件夹内的新.php 文件中使用$wpdb。
$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$url = $_SERVER['REQUEST_URI'];
$my_url = explode('wp-content' , $url);
$path = $_SERVER['DOCUMENT_ROOT']."/".$my_url[0];
include_once $path . '/wp-config.php';
include_once $path . '/wp-includes/wp-db.php';
include_once $path . '/wp-includes/pluggable.php';
global $wpdb;
【讨论】:
你应该只是require_once('../../../wp-load.php');
然后你所有的 WordPress 类、钩子和所有东西都将被加载。现在您可以使用global $wpdb; 开始与数据库交互,wpdb 实例将被启动。
【讨论】:
您只需要将 wp-load.php 文件包含到您的脚本中。
require('the/path/to/wp-load.php file');
【讨论】:
这也应该可以解决问题:
preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
include($path[1] . 'wp-load.php');
【讨论】:
以下两步就够了。
之后您可以在此页面中使用的任何全局变量。确保您提供正确的 wp-blog-header.php 包含路径。无需包含多个文件。
【讨论】:
只需一行代码即可实现快速且轻量级的方式
require(dirname(_FILE__).'/wp-blog-header.php');
原因是因为 WordPress 初始化加载 index.php 并且当您检查 index.php 时,您会看到:
require(dirname(__FILE__).'/wp-blog-header.php');
这会加载和引导 WordPress。
所以要在 WordPress 安装之外使用 WordPress,只需创建一个新文件,然后编写:
require(dirname(__FILE__).'/wp-blog-header.php');
然后进行测试,编写:global $wpdb; var_export($wpdb) 。
所以现在您可以访问所有 WordPress API 和数据库对象 $wpdb。
【讨论】:
截至 2021 年 6 月 21 日,这在他们的文档中,https://developer.wordpress.org/reference/classes/wpdb/,它对我来说无缝工作:
$wpdb = $GLOBALS['wpdb'];
【讨论】: