問題描述
我遇到的所有檔案都會透過外掛討論覆蓋可插拔功能。
如果你正在做主題開發怎麼辦?
我的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。