2011-03-15 39 views
30

我正在尝试使用WPDB连接到Wordpress,因为它是如此美丽的类,并且还有wp-config.php中指定的配置,因此我不需要再指定它。在独立脚本中使用WPDB?

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

我该如何归档?

任何帮助表示赞赏。

回答

40

最好的(最快和最安全的)方式来加载只加载的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与仅包含您需要的文件相比,在速度/性能方面值得进行小幅折衷,在大多数情况下,与满载相比,性能提升很大。

+0

这绝对是最好的答案! – 2015-05-22 03:29:07

+0

到目前为止,使用SHORTINIT作为自定义脚本的最佳答案是速度更快。 – 2015-07-25 12:29:00

+0

谢谢!这正是我需要的。 wp-db.php本身需要一些无关的WP函数,这些函数不包含在内,这就解决了这个问题。 – 2016-04-06 03:00:05

41
<?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 
+20

“wp-load.php”不够? – 2011-03-16 21:30:20

+2

是的,wp-load本身就足够了,它加载了所有的剩余部分 - 换句话说,这是加载所有的WordPress,包括所有的插件。 – 2013-03-20 22:47:10

16

的WordPress实际上允许你只创建一个名为db.php文件并将其保存在您的wp-content的根目录下使用自己的DBA(数据库抽象层)。

我遇到了需要通过我写的类来访问数据库的问题,这与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的类),你可以使用JUSE:

$wpdb = DB::getInstance(); 

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

+0

获取$ wpdb的美丽方式 – hidden 2012-07-16 20:57:32

+0

哇,我在哪里可以了解更多关于WordPress的DBA和db.php文件? – BenRacicot 2015-03-05 03:14:11

+0

与此问题是代码仍然调用WordPress函数像apply_filter。我试图找到一种方法来包含任何其他无关的PHP文件(或整个事情)。 – 2016-04-06 02:56:29

11

通过使用以下代码,您可以在主题文件夹内的新.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; 
+0

据我所见,这是在这里提到的加载最低代码仅使用wpdb,而不加载所有WordPress的唯一方法... – 2013-03-20 22:48:16

2

以下两步就够了。

  1. 包含的WP-博客 - header.php文件
  2. 使用WPDB $,把全球WPDB $之前;

您可以在此页面中使用的任何全局变量。确保你提供了正确的包含wp-blog-header.php的路径。不需要包含多个文件。

3

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

然后你所有的wordpress类钩子,一切都会加载。现在您可以开始使用全局$ wpdb与数据库进行交互了,wpdb实例将启动

4

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

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

这应该做的伎俩:

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

只是一个单一的线速度与轻量级的方式是

要求(目录名(_FILE__)'/可湿性粉剂博客 - header.php文件。 “);

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

要求(目录名(__FILE__) '/可湿性粉剂博客 - header.php文件'。) ;

这加载和引导WordPress的。

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

要求;(目录名(__FILE__) '/可湿性粉剂博客 - header.php文件'。)

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

所以现在你可以访问所有的wordpress API和数据库对象$ wpdb。