在独立脚本中使用WPDB?

时间:2011-03-15 01:44:49

标签: wordpress

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

我将从主WordPress写一个小的独立脚本,在后台运行,需要使用这个WPDB实例。

我如何存档?

感谢任何帮助。

10 个答案:

答案 0 :(得分:61)

加载仅加载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值得在速度/性能方面进行微小的权衡,而只包含您需要的文件,而且在大多数情况下,与满载相比,性能会大幅提升。

答案 1 :(得分:47)

<?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

答案 2 :(得分:19)

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

答案 3 :(得分:14)

您可以使用以下代码在主题文件夹中的新$wpdb文件中使用.php

$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;

答案 4 :(得分:4)

您只需要将wp-load.php文件包含在脚本中。

require('the/path/to/wp-load.php file');

答案 5 :(得分:4)

这也应该起到作用:

  preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
  include($path[1] . 'wp-load.php');

答案 6 :(得分:3)

你应该require_once('../../../wp-load.php');

然后你们所有的WordPress类,钩子和一切都将被加载。现在,您可以使用global $wpdb;开始与数据库交互,并且将启动wpdb实例。

答案 7 :(得分:2)

以下两个步骤就足够了。

  1. 包含wp-blog-header.php文件
  2. 在使用$ wpdb之前,将其设为全局$ wpdb;
  3. 之后您可以在此页面中使用的任何全局变量。确保给出wp-blog-header.php的正确包含路径。无需包含多个文件。

答案 8 :(得分:1)

只需一行即可快速轻巧地使用

需要(目录名(的 _FILE __ ) '/ WP-博客-的header.php');

原因是因为WordPress初始化加载index.php,当你检查index.php时,你会看到:

需要(目录名(<强> __ FILE __ ) '/ WP-博客-的header.php');

这加载和引导WordPress。

所以要在WordPress安装之外使用WordPress,只需创建一个新文件然后写:

需要(目录名(<强> __ FILE __ ) '/ WP-博客-的header.php');

然后进行测试,写:global $ wpdb; var_export($ wpdb)。

所以现在您可以访问所有WordPress API和数据库对象$ wpdb。

答案 9 :(得分:0)

截至 2021 年 6 月 21 日,这已在他们的文档 https://developer.wordpress.org/reference/classes/wpdb/ 中,并且对我来说是无缝的:

$wpdb = $GLOBALS['wpdb'];