動作和過濾器
Wordpress Hooks
開始使用 WordPress 時經常讓開發人員感到困惑的是使用 apply_filters()
和 add_action()
。你會經常看到外掛/主題在程式碼中使用這些外掛/主題,如果你不理解這個概念,你會發現很難使用它們。
簡而言之(非常簡短,詳細檢視 WordPress 載入流程圖的過程),WordPress 按以下方式載入:
- wp-load.php - 函式等
- mu-plugins - 在 mu-plugins 資料夾中找到的任何檔案 - 通常用於提供快取的物件
- 外掛 - 沒有特定的順序,任何已安裝和啟用的外掛都將被載入
- 活躍的兒童主題/父主題
- init - 其餘資料
- 模板
如果你是開發人員並使用函式檔案,則可以看到在過程的早期載入的都比你使用的檔案載入的都要多。這意味著你無法修改程序(請注意,你無法覆蓋函式)或稍後執行或尚未定義的變數。主題開發人員也可能在其程式碼中放置鉤子以允許外掛掛鉤或外掛可能允許其他外掛覆蓋其變數。到目前為止,這可能會令人困惑,但請留在那裡。
要了解 add_filter()
和 add_action()
,我們需要先了解鉤子是如何建立的。
$arga= 'hello';
do_action('im_a_hook', $arga );
當你在 WordPress 中遇到上述內容時,它將呼叫附加到 hook im_a_hook
的任何函式(查詢 $wp_filter
以獲取有關該過程的資訊)。在你的附加功能中,$arga
將可用於附加功能。
add_action('im_a_hook', 'attached_function');
function attached_function($arga){
echo $arga;
}
這為在載入過程的某些點修改變數提供了強大的新機會。還記得我們之前說過模板是在外掛/主題之後載入的嗎?一個常見的外掛是 WooCommerce,它會在後面的過程中建立螢幕,我不會記錄如何在外掛中找到 do_action
的示例。
do_action( 'woocommerce_after_add_to_cart_button' );
這裡我們建立了一個不傳遞變數的鉤子,但我們仍然可以玩得開心:
add_action( 'woocommerce_after_add_to_cart_button', 'special_offer');
function special_offer(){
echo '<h1>Special Offer!</h1>;
}
上面的 add_action
將是 echo
的特價商品,其中 do_action('woocommerce_after_add_to_cart_button')
位於建立 WooCommerce 螢幕時。所以我們可以使用這個鉤子來插入 html。其他用途可能包括完全重定向到不同的螢幕等。
也可以將多個變數傳遞給函式。在主題函式中試試這個。請注意我們設定為 3 的最後一個引數,因為我們希望使用 3 個可用引數。如果我們將其更改為 2,則只返回 2 並且我們將得到未定義的錯誤。
add_action('custom_hook', 'attached_function', 10, 3);
function attached_function($a,$b,$c){
var_dump($a);
var_dump($b);
var_dump($c);
}
$arga = 1;
$argb = 2;
$argc = 3;
do_action('custom_hook', $arga, $argb, $argc);
exit;
還有另一種稱為過濾器的 WP 鉤子型別。過濾器與其使用中的動作不同,動作只能接收變數,顯然這些變數都在函式範圍內(你應該知道什麼是 php 範圍,如果不是 google)。過濾器傳回返回的資料,因此你可以使用它來修改變數。
$filter_me= apply_filters('im_a_filter', $variable_to_filter);
如果你看到上述內容,則可以修改 $filter_me
的值,因為你返回的任何資料都將是儲存在變數中的值。例如(注意我們在示例中將 $variable_to_filter
更改為 $filter_me
):
add_filter('im_a_filter', 'attached_function', 100);
function attached_function($filter_me){
$filter_me= 'ray';
return $filter_me;
}
$filter_me = 'bob';
$filter_me= apply_filters('im_a_filter', $filter_me);
$filter_me
變數現在將包含 ‘ray’ 而不是 ‘bob’ ,我們將優先順序設定為 100,因此我們有理由相信沒有人在使用後更改值(可以在同一個鉤子上執行多個過濾器)所以我們可以現在,如果存在 apply_filters()
,則更改過程中稍後使用的變數。
你也可以傳遞多個引數,但只能更改一個引數的值。你還必須返回一個值,否則你的變數將不包含任何內容。如果你瞭解如何使用 php 將值/陣列/物件分配給變數,這對你來說是顯而易見的,例如:
add_filter('im_a_filter', 'attached_function', 100, 3);
function attached_function($filter_me, $arga, $argb){
$filter_me= 'ray'.$arga.$argb;
$arga= 'you fool';
return $filter_me;
}
$filter_me = 'bob';
$arga = ' middlename';
$argb = ' surname';
$filter_me= apply_filters('im_a_filter', $filter_me, $arga, $argb);
$filter_me
變數現在包含 ‘ray middlename surname’ 。但是什麼關於 $arga
?這仍然包含 ‘middlename’ ,在我們的函式中將 $arga
更改為 ‘you fool’ 對其範圍之外的定義值沒有影響(有方法,谷歌全域性等)