在独立脚本中使用 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!。只有一个 includerequire 适合我!【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装 pyspark 以在独立脚本中使用?

如何在独立脚本运行时锁定电子表格

独立的laravel脚本

PHP 中的 Joomla 独立脚本 - 握手

在 Apache Zeppelin 上运行独立的 python 脚本

使用命令行参数在另一个 Python 脚本中调用一个 Python 脚本