問題描述

在開發主題和外掛時,有時需要使用條件語句為某些鉤子新增一些功能。

例:

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。