2012-12-13 36 views
9

我試圖反向工程插件:http://wordpress.org/extend/plugins/wordpress-social-login/WordPress的WP-load.php

在它的一部分,有這樣一行:
(我有一個很難理解的第一個,剩下的只是有參考,如果他們有事情做了。)

require_once(dirname(dirname(dirname(dirname(__FILE__)))) . '/wp-load.php'); 

define('WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL', plugins_url() . '/' . basename(dirname(__FILE__))); 
define('WORDPRESS_SOCIAL_LOGIN_HYBRIDAUTH_ENDPOINT_URL', WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/hybridauth/'); 

我的問題是......究竟是什麼在這個wp-load.php文件,它需要的代碼需要?通過查看它,我所瞭解的是,它加載了關鍵的核心wordpress文件,以便網站能夠正常運行(functions.php,wp-settings.php,wp-config.php etc ...)
插件是否已運行的事實意味着wp-load.php已加載?
這也是一個完全的資源浪費,因爲它包含了很多文件,也可能包含其他文件,它就像是一個無限循環的所需文件,每個文件都在另一個文件中,被加載兩次..(或者更多,如果其他插件也使用這種方法)

那麼它究竟做了什麼?

P.S;我通過Google發現的所有方法都是如何正確包含它(因爲路徑是可以改變的) - 但這不是我的問題/問題。

回答

23

我的問題是......這個wp-load.php文件究竟是什麼,它需要代碼需要?

所有的核心WordPress功能。這包括主題文件,活動插件的所有文件等。但是以這種方式加載WordPress不解析請求的URL並且不運行WordPress查詢(通過初始化WP對象,也不WP_Query對象) 。

通過觀察它,所有我的理解是,它加載的網站的關鍵核心WordPress的文件被運行正常(functions.phpwp-settings.phpwp-config.php等)

是的,你」我正確理解了。

不是插件運行的事實意味着加載了wp-load.php嗎?

如果插件代碼是由WordPress的(爲了顯示管理頁面的情況下,或將其納入由最初加載插件文件)調用 - 然後是的,這意味着wp-load.php已經加載。

雖然有時插件會將請求直接發送到單個文件(例如http://example.com/wp-content/plugins/my-plugin/sample.php),而不是某些WordPress驅動的頁面(例如http://example.com/?my_plugin_action=samplehttp://example.com/wp-admin/admin-ajax.php)。

看看第一個URL如何引用my-plugin插件目錄中的特定文件,第二個引用添加了特定查詢參數的網站的主頁,或第三個示例,其中引用的文件是admin-ajax.phpwp-admin目錄 - 這是一個特殊的文件,它使得插件很容易地發出AJAX請求(這個文件也加載了WordPress核心並且觸發了一些動作鉤子)。

對於第一次參考,如果插件想要使用一些WordPress功能(用於引用數據庫,操作帖子等),它需要通過包含wp-load.php加載WordPress核心文件。

由於它包含很多可能包含其他文件的文件,它就像是一個無限循環的所需文件,每個文件都在另一個文件中,它們被加載兩次..(或者甚至是更多,如果其他插件使用這種方法太)

注意_once部分require_once(... - 這告訴PHP包括文件只如果沒有已經包含它。因此不會發生衝突,並且PHP不會使用太多的內存。雖然 - 如果您處於WordPress已啓動的環境中,則不應調用require函數。


因此,基本上插件作者希望對您在其中找到此代碼的插件文件進行一些請求。由於作者想在此文件中使用WordPress功能,因此他調用wp-load.php文件來加載核心功能。

我認爲,這是爲了減少服務器上的負載,儘管在plugins_loaded操作掛鉤上運行了幾個掛鉤並將自定義$_GET參數添加到了主頁url,但結果仍然應該很漂亮關。

我個人比較喜歡第二種選擇,但正如我所說的,其中包括wp-load.php阻止WordPress運行一些複雜的東西(URL解析和數據庫查詢)。

如果仍然有什麼,你不太瞭解 - 在這裏發表評論,我會嘗試進一步解釋。

+1

非常詳細的答案! 非常感謝你! :) – Asaf

1

可能是一個雙重檢查。

require_once()表示如果它已經被加載,那麼它將不會再次加載。

1

wp-load.php是從外部腳本加載WP的一種方式,允許在其他功能中使用WP功能。

但是,正如你所說,這不應該是必要的,因爲它是一個插件。然而,你不會解釋你在哪裏找到問題中的代碼,因爲wp-load.php確實需要位於與樣式表目錄不同的目錄中的前端頁面或腳本,例如,即使它們屬於插入。

管理區域中的插件頁面不必重新加載WP,因爲它已經加載,但前端頁面必須加載它。

總之,有幾個原因可以使wp-load.php有權訪問WP函數和變量。

2

wp-load.php負責引導WordPress環境,使插件能夠使用本地WordPress核心功能。

現在作爲

不該插件運行已經意味着事實WP-load.php裝?

一點都沒有!

如果您直接訪問插件文件,並不意味着您擁有整個WordPress環境,並且除非包含wp-load.php,否則無法使用本機核心功能。

1

這將包括wp-load.php,如果該文件位於wp-content目錄內的任何位置(不管其級別如何),如果尚未加載wp-load.php。

if(!defined(ABSPATH)){ 
    $pagePath = explode('/wp-content/', dirname(__FILE__)); 
    include_once(str_replace('wp-content/' , '', $pagePath[0] . '/wp-load.php')); 
} 
+0

沒有試圖從wp-content文件夾中獲取它?爲什麼會在那裏?它在根源上,通常至少。 –