問題描述
在開發主題和插件時,有時需要使用條件語句為某些鈎子添加一些功能。
例:
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。