【问题标题】:Using WPDB in standalone script?在独立脚本中使用 WPDB?
【发布时间】:2011-07-15 11:08:49
【问题描述】:

我正在尝试使用 WPDB 连接到 WordPress,因为它是一个非常漂亮的类,并且在 wp-config.php 中指定了一些配置,所以我不需要再次指定它。

我要从主 WordPress 中编写一个单独的小脚本,以便在需要使用此 WPDB 实例的后台运行。

我该如何存档?

感谢任何帮助。

【问题讨论】:

    标签: wordpress


    【解决方案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】:

      以下两步就够了。

      1. 包含 wp-blog-header.php 文件
      2. 在使用 $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'];
          

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 2015-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-19
            • 2011-10-23
            • 2017-06-26
            • 1970-01-01
            相关资源
            最近更新 更多