在独立脚本中使用 WPDB?
Posted
技术标签:
【中文标题】在独立脚本中使用 WPDB?【英文标题】:Using WPDB in standalone script? 【发布时间】:2011-07-15 11:08:49 【问题描述】:我正在尝试使用 WPDB 连接到 WordPress,因为它是一个非常漂亮的类,并且在 wp-config.php 中指定了一些配置,所以我不需要再次指定它。
我要从主 WordPress 中编写一个单独的小脚本,以便在需要使用此 WPDB 实例的后台运行。
我该如何存档?
感谢任何帮助。
【问题讨论】:
【参考方案1】:仅加载 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
值得在速度/性能上进行小幅权衡,而不是仅包含您需要的文件,并且在大多数情况下,与满载相比,它的性能提升很大。
【讨论】:
这绝对是最好的答案! 到目前为止,使用 SHORTINIT 进行自定义脚本的最佳答案是快很多。 谢谢!这正是我所需要的。 wp-db.php 本身需要一些不包含在内的无关 WP 函数,这解决了这个问题。 我试过了,发现它改变了我的时区设置。我查看了wp-settings.php
并发现:date_default_timezone_set( 'UTC' );
很烦人。最让我担心的是,我不知道还有什么可能会受到影响。【参考方案2】:
确实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
还不够吗?
是的,wp-load 本身就足够了,它会加载所有其余部分 - 换句话说,这是加载所有 WordPress,包括所有插件。
当我在functions.php中使用@farinspace代码(有2个或更多include_once()
或require()
)时,我得到internal server error 500
!。只有一个 include
或 require
适合我!【参考方案3】:
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
。
【讨论】:
获取$wpdb的好方法 哇,我在哪里可以了解有关 WordPress 的 DBA 和 db.php 文件的更多信息? 这个问题是代码仍然调用像apply_filter这样的WordPress函数。我正在尝试找到一种方法来避免包含任何其他无关的 PHP 文件(或整个文件)。 我不明白。你如何使用它?使用您在非 WP 脚本中所说的 db.php 文件(如问题所问)将获得Fatal error: Class 'wpdb' not found
【参考方案4】:
您可以使用以下代码在主题文件夹内的新.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;
【讨论】:
据我所知,这是这里提到的加载最少代码以仅使用 wpdb 而不加载所有 WordPress 的唯一方法...【参考方案5】:你应该只是require_once('../../../wp-load.php');
然后你所有的 WordPress 类、钩子和所有东西都将被加载。现在您可以使用global $wpdb;
开始与数据库交互,wpdb 实例将被启动。
【讨论】:
最佳答案!【参考方案6】:您只需要将 wp-load.php 文件包含到您的脚本中。
require('the/path/to/wp-load.php file');
【讨论】:
【参考方案7】:这也应该可以解决问题:
preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
include($path[1] . 'wp-load.php');
【讨论】:
嗨,Hamid Araghi,基本上这没什么大不了的。 dirname(FILE) 的 preg_match 存储在变量 $path 中。如果您不经常使用它,那么棘手的部分可能是 preg_match 参数。请参阅此处以获取良好的测试方法和页面底部的参数备忘单:phpliveregex.com【参考方案8】:以下两步就够了。
-
包含 wp-blog-header.php 文件
在使用 $wpdb 之前,请将 $wpdb 设为全局;
之后您可以在此页面中使用的任何全局变量。确保您提供正确的 wp-blog-header.php 包含路径。无需包含多个文件。
【讨论】:
【参考方案9】:只需一行代码即可实现快速且轻量级的方式
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。
【讨论】:
【参考方案10】:截至 2021 年 6 月 21 日,这在他们的文档中,https://developer.wordpress.org/reference/classes/wpdb/,它对我来说无缝工作:
$wpdb = $GLOBALS['wpdb'];
【讨论】:
以上是关于在独立脚本中使用 WPDB?的主要内容,如果未能解决你的问题,请参考以下文章