2011-03-15 107 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。