在独立脚本中使用WPDB?

Duc*_*tal 48 wordpress

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

我将从主wordpress写一个小的分离脚本,在后台运行,需要使用这个WPDB实例.

我该如何存档?

任何帮助表示赞赏.

Pel*_*red 64

加载仅加载WordPress的核心功能的最佳(最快和最安全)方式是使用这样的SHORTINIT标志:

define( 'SHORTINIT', true );

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

//Here you can use WordPress core features, for example the $WPDB object
Run Code Online (Sandbox Code Playgroud)

有关此内容的详细信息并查看加载的内容,请检查代码/wp-settings.php.在那里你会发现以下部分:

// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
    return false;
Run Code Online (Sandbox Code Playgroud)

这意味着之后的任何内容都不会被加载,而且你可以看到很多东西.占用空间将比仅加载更小,wp-load.php并且仍然允许您访问WordPress核心中的所有内置函数,不像/wp-includes/wp-db.php直接包含.WP核心中的许多功能也在其他文件中具有依赖性,并且可能很难弄清楚您需要包含哪些文件以便能够执行您想要的操作.SHORTINIT包括所需的依赖项,因此您不必担心这一点.

如果你确切地知道你需要什么,例如只有WPDB,最快的方法当然只包括你需要的文件,但是SHORTINIT提供了一种更安全,更标准化的方式来加载WP核心和依赖项.使用SHORTINITWordPress不会加载插件,插件API的大部分内容,主题,主题功能以及大多数管理和前端功能.这是重型代码在典型的WordPress安装中的地方.在大多数情况下,SHORTINIT与仅包含您需要的文件相比,我认为值得在速度/性能方面进行小的权衡,并且在大多数情况下,与满载相比,性能会大幅提升.

  • 这绝对是最好的答案! (2认同)
  • 到目前为止,将 SHORTINIT 用于自定义脚本的最佳答案要快得多。 (2认同)

far*_*ace 48

<?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
Run Code Online (Sandbox Code Playgroud)

  • `wp-load.php`不够吗? (22认同)
  • 是的,wp-load本身就足够了,它会加载所有其余的 - 换句话说,这是加载所有WordPress,包括所有插件. (2认同)

Mat*_*rey 20

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();
Run Code Online (Sandbox Code Playgroud)

现在当需要wpdb从其他地方使用时(在我的情况下是一个非WordPress类),你可以使用:

$wpdb = DB::getInstance();
Run Code Online (Sandbox Code Playgroud)

从一个方法内,而不是可怕的global.


Ank*_*r21 14

您可以使用以下代码在主题文件夹中的新.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;
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,这是这里提到的加载最少代码以使用 wpdb,而不加载所有 WordPress 的唯一方法...... (2认同)

小智 5

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

然后你所有的 WordPress 类、钩子和所有东西都将被加载。现在您可以开始与数据库交互,global $wpdb;wpdb 实例将启动。