問題描述

我遇到的所有文檔都會通過插件討論覆蓋可插拔功能。

如果你正在做主題開發怎麼辦?

我的 functions.php 需要另一個文件來覆蓋 pluggable.php 中定義的 get_user_by()函數。

如果我省略了 if( function_exists() )調用,我得到 「無法重新發送…」 錯誤。

如果我包括 if( function exists() )調用,那麼我沒有錯誤,但是當然我的功能被忽略,因為可插拔版本存在。

基於 Dominic 在 the WordPress startup order 上的令人敬畏的帖子,很顯然,pluggable.php 在您的主題的 functions.php 等之前加載,因此可以解釋錯誤。

所以問題是 – 如何從一個主題中利用這個可愛的可插拔架構,而不需要編寫插件,然後必須捆綁或安裝主題?

更多注意事項:所以看來,這個論點是主題不應該試圖做插件。但是這個説法是四歲以上 (根據 4 位數的 trac 號) 。考慮到今天主題開發景觀的複雜拓撲結構,我很樂意聽到一些沉重的打擊者的看法。我想相信自那以後我們已經演變。

背景信息:我為客户開發了一個 one-off CMS 解決方案,具有很多自定義元數據,管理員 back-end 的定製,登錄/身份驗證過程,作品。當然,還有設計組件 – 這就是主題部分所在。事實上,這些組件根本不是可重用的組件 – 它們永遠不會適用於另一個客户端,它們永遠不會被放在 GPL 和開放源代碼之下,而且它們最多肯定不會在其他 WordPress 部署上分發/安裝。最好還有一些我將來會對未來項目有利的最佳實踐,但這將是嚴格的參考/copy-paste 工作。

這聽起來不像是插件給我的用例。主題是安裝的,也許是二十一十一的孩子主題,也許是一個獨立的,它的 functions.php 調用在一個包含的船隻,每個處理有問題的 CMS 的不同方面。然後,主題模板文件使用在包含中定義的自定義’template tags’ 。我不想有一些主題文件依賴於某些插件或其他被激活等等。在系統中構建複雜性是沒有意義的。當然,我可以把它放在 must-use 插件文件夾中,但是仍然感覺像是一個黑客 – 現在,與本項目所做的定製有關的一切都包含在 wp-content/themes/my-theme/中。我也不想考慮在一些插件文件夾中搜索東西。

不要誤會我我喜歡插件,我使用它們並編寫它們。當插件是 third-party 時,我會使用插件和這種高度自定義的主題開發,並表示遠遠超出了我在合理的時間框架內可能推出的最佳實踐。但是當我需要修改一個 one-off 場景的核心功能時,我轉而採取行動鈎子,過濾器鈎子,而且我想要能夠依賴用户和身份驗證方面的可插拔功能。

最佳解決方案

如果您為單個客户端構建,那麼您應該絕對利用 mu-plugins

WordPress 中有很多東西在 functions.php 中無法做到。可插拔功能是其中之一,但更為明顯的是,在 functions.php 之前,有許多掛鈎 (動作和過濾器) 都會觸發。在某些情況下,這些鈎子甚至會在常規插件之前啓動,然後需要使用 mu-plugins 或 network-activated 插件。在其他情況下,即使是 mu-plugin 也是太晚了。也許你需要在 sunrise.php 中的東西。或者甚至是 wp-config.php 的東西 (常數或其他) 。

我寧願添加一些鈎子到可插拔的功能,而不是使它更容易覆蓋它們。我們不太可能再有一個可插拔的功能 – 他們的 pre-date 鈎子和我幾乎從來沒有看到有一個好的 old-fashioned(new-fashioned?) 鈎子有優勢的情況。

六年後,Andy Skelton 仍然同意:「主題功能文件和插件之間有許多區別,讓我們一起來吧。」

除此之外,這樣的改變永遠都不會發生。它會打破很多事情。 functions.php 的主體中無數主題調用函數,如果 pluggable.php 尚未加載 (如 current_user_can()) 或 wp_create_nonce(),將導致致命錯誤。他們都失敗了它也會打破插件,通常可以開始在 plugins_loaded 上調用這些功能。 (剛剛在 wp-settings.php 中移動 pluggable.php,我下注一半的核心會破壞 – 或者至少是定製工具。)

最後,不可避免的想法是,一個主題可以包括一個單獨的文件,如 pluggable.php,我們可以在加載插件時加載,因此可以覆蓋可插拔功能。除了這個錯誤的想法 (見這篇評論的前四段),它仍然是不兼容的,因為直到 setup_theme 掛鈎,可以通過過濾樣式表和模板值來覆蓋哪個主題被加載。

不幸的是,鑑於 WordPress 的架構如何,這只是不能成功的。好的是,有無數 (更好) 的方式來做到這一點。

(原本貼在這裏:http://core.trac.wordpress.org/ticket/2479#comment:5)

次佳解決方案

在 once-off 項目的上下文中,將 must-use 代碼放入 mu-plugins 是絕對適用的。如果 「一次性存在」 是一個問題,只需在 mu-plugins drop-in 的主題目錄中創建一個符號鏈接,就會在搜索主題目錄時顯示。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。