問題描述
在開發主題和外掛時,有時需要使用條件語句為某些鉤子新增一些功能。
例:
function my_custom_function() {
if( is_home()) {
<---what should the function do--->
}
}
add_action( 'some_hook', 'my_custom_function' );
據我瞭解,每當存在任何其他條件 (is_home 返回 false) 時,函式的內容都不會執行,但是該函式是執行的,儘管它是”empty” 。這意味著一個空的函式傳遞給鉤子。這是所有示例在使用條件標籤的 codex 中顯示的方式。
我明白這樣做是安全的,它不會對載入時間產生任何重大影響 (如果對載入時間有任何影響) 。
我一直在想,同樣的程式碼片段,例如,可以寫成如下
if( is_home()) {
function my_custom_function() {
<---what the function should do--->
}
add_action( 'some_hook', 'my_custom_funtion' );
}
如果 is_home 返回 false,這將完全跳過所有內容。
我不介意使用這兩種方法。但是我想知道的是,由於第一個例子被廣泛使用,有沒有任何編碼標準說明這是正確的使用方法,或者這是根據 wordpress 開發人員的預測方式,還是個人偏好。
最佳解決方案
WordPress coding standards for PHP 沒有說明任何內容,沒有其他標準,所以開發人員可以選擇一種方式。
我不得不說,這兩種方法有不同的方法; 而第一個包含條件邏輯,第二個是條件函式宣告,這意味著如果您嘗試呼叫該函式,則會獲得致命錯誤。
即使使用第一種方法,函式的執行方式 (對應用程式負載不相關和丟失的效能影響非常小),因此使用第二種方法時,使用第二種方法時,業務邏輯您的應用程式從函式移動到檔案解析。
此外,你應該考慮有沒有提到的第三種方法:
function my_custom_function() {
// what the function should do
}
if ( is_home() ) {
add_action( 'some_hook', 'my_custom_function' );
}
當使用 OOP 程式設計時,這種方法的好處是更可察覺的:在這種情況下,類條件宣告沒有任何意義 (並且方法條件宣告根本是不可能的),但是隻有在特定條件下才能執行很多有意義的執行任務鉤子射擊) 。
次佳解決方案
不要在飛行中建立功能。這很難閱讀和除錯。實現 separation of concerns,並將回撥的註冊與其執行 (業務邏輯) 分開。在回撥註冊之前邏輯地設定條件檢查現在已經很簡單了。等待操作 template_redirect 例項化該註冊處理程序,因為當您知道是否可以檢查 is_home()時。
例
class Theme_Hooks
{
public function setup()
{
if ( ! is_404() ) {
add_action(
get_stylesheet() . '_breadcrumb',
[ new Breadcrumb, 'render' ]
);
}
if ( is_home() ) {
add_action(
get_stylesheet() . '_home_widget',
[ new Home_Widget, 'render' ]
);
}
}
}
add_action( 'template_redirect', [ new Theme_Hooks, 'setup' ] );
第三種解決方案
我只是想補充說,一般來說,應該謹慎使用條件標籤,如:
if( is_*() )
{
// stuff
}
在 functions.php 的全域性範圍內,因為它將在 do_action()或 apply_filters()發生任何過濾器或操作之前執行。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。