WordPress 鉤子指南

已發表: 2021-07-19

鉤子系統對於初學者來說似乎令人生畏,但它們是 WordPress 最好的東西之一。 本指南將幫助您了解鉤子的基礎知識以及如何使用它們,提供示例用法和進一步的建議。

為什麼要使用鉤子?

如果您還沒有意識到,更改 WordPress (WP) 中的核心文件是一個非常糟糕的主意。 拋開安全風險不談,每次更新 WP 時,您的更改都會被覆蓋! 插件和主題也是如此。

當然,您可以跟踪每個更新並重新實施您的更改。 可以穿過蜂箱來取蜂蜜。 這可能看起來很方便,但你遲早會被蜇到。

簡而言之,您應該使用鉤子,因為它們抵消了更改核心功能的風險

從這個意義上說,鉤子的重要性怎麼強調都不為過 它們是 WP 可擴展性的關鍵,也是其插件和主題生態系統的基石。 通過學習基礎知識並很好地利用它們,您將為自己省去很多麻煩。

這些是什麼?

您可以將鉤子視為在整個 WP 加載序列中發生的事件 當 WP 遇到一個鉤子時,它會在繼續之前觸發所有附加到該鉤子的函數。

因此,您可以利用鉤子在 WP 中添加功能或更改變量 您可以使用現有的鉤子並添加新的鉤子。 您可以移除不需要的掛鉤。 您可以多次擊中同一個鉤子,按您認為合適的方式對每個功能進行優先級排序。 這是一個非常靈活的系統,僅受可用的鉤子和它們公開的數據的限制。

它們是如何工作的?

您向鉤子添加一個或多個函數。 其他功能也可能由您的主題、插件或 WP 本身添加。 當 WP 加載時,它會遇到鉤子。 它檢查與鉤子關聯的所有函數的列表。 WP按優先順序運行所有這些功能 完成後,它會在鉤子之後繼續加載所有內容。

他們看起來怎麼樣?

向鉤子添加函數如下所示:

add_action( $hook_name, $function_name, $priority, $arguments );

$hook_name是您要定位的鉤子的名稱

$function_name是要添加到該鉤子的函數的名稱

$priority是一個整數,表示$function_name$hook_name的隊列中的優先級 數字越小,優先級越高。 從 1 開始,此數字可以隨您的需要而增加(在系統限制範圍內),但您不太可能看到它高於 40。默認值為 10。

$arguments是一個整數,表示您在函數中使用的參數數量。 必須與傳遞給函數的參數數量相匹配。 默認值為 1。

從鉤子中刪除一個函數幾乎是一樣的:

remove_action( $hook_name, $function_name, $priority );

$函數名$必須優先原始值從相應的ADD_ACTION功能匹配,否則將不會被刪除!

鉤子的種類

有兩種主要類型的鉤子:動作鉤子和過濾器鉤子。 它們在很多方面都很相似—— add_action()和它的對應add_filter()都以相同的方式調用。 不同之處在於您傳遞的函數:


// 運行一些代碼
add_action('where_to_do_the_thing', 'do_the_thing');
函數 do_the_thing() {
// 執行某些操作所需的操作
}

// 改變一個變量
add_filter('the_thing', 'change_the_thing');
函數 change_the_thing( $thing ) {
// 過濾 $thing 並更改為您需要的任何內容,然後...

返回 $thing;
}

注意,在第二示例中,第一個參數傳遞給函數的n為被修正的值。 任何附加參數僅用於實用程序,不會通過鉤子傳回。

您可能已經註意到我省略了$priority$arguments 這是因為默認值很好。 如果有幫助,上面的內容與以下內容基本相同:


// 運行一些代碼
add_action( 'where_to_do_the_thing', 'do_the_thing', 10, 1 );
// 改變一個變量
add_filter( 'the_thing', 'change_the_thing', 10, 1 );

這些當然是人為的例子,但它們說明了兩者之間的主要區別:過濾器用於更改變量,操作用於添加代碼。

不那麼做作的例子

假設您想讓 WP 在新用戶在您的網站上註冊時發送電子郵件通知。 參考 WP codex,您可以找到user_register操作掛鉤。 這為您提供了一個$user_id變量,您可以使用它來獲取用戶的詳細信息。 wp_mail()處理其餘的:


add_action('user_register', 'notify_on_user_registration');
函數 notify_on_user_registration( $user_id ) {

// 獲取用戶
$user = get_user_by('id', $user_id);

// 準備郵件主題和正文
$subject = “新用戶註冊”;
$message = “一個新用戶 {$user->first_name} {$user->last_name} 已經註冊。”;

// 發送電子郵件
wp_mail('[email protected]', $subject, $message );
}

如果您想在登錄時將用戶重定向到您的首頁怎麼辦? 您可以使用login_redirect鉤子輕鬆實現這一點,該鉤子提供默認情況下用戶重定向到的 URL:


add_filter('login_redirect', 'redirect_user_on_login');
函數redirect_user_on_login( $redirect_to ) {
返回 home_url();
}

添加此內容後不久,您很快就會意識到,作為管理員,您希望直接進入 WP 儀表板而不是主頁。 沒問題——您只需修改鉤子,使其僅適用於管理員:


add_filter( 'login_redirect', 'redirect_user_on_login', 10, 3 );
函數redirect_user_on_login( $redirect_to, $request, $user ) {
// 除非用戶是管理員,否則更改登錄 URL
if ( isset( $user->roles ) && is_array( $user->roles ) ) {
if ( in_array( '管理員', $user->roles ) ) {
返回 $redirect_to; // 將管理員重定向到默認(管理區域)
}
}

返回 $redirect_to;
}

請注意, $priority$arguments開始發揮作用了!

由於需要訪問鉤子的第三個參數來檢查用戶的級別,所以需要顯示3個參數; 你傳遞了一個 3 的值。

當然, $priority值 10 與默認值相同,但指定它是為了達到您上面需要$arguments值。

創建自己的鉤子

創建自定義掛鉤的能力在您的手中! WP 提供的功能如下所示:

do_action( $hook_name, $arg_1, $arg_2 ... $arg_n );

apply_filters( $hook_name, $arg_1, $arg_2 ... $arg_n );

再說一次,它們有點相似。 這兩個函數都接受一個名稱——這是你命名鉤子的地方。 以下所有參數都是可用於添加到該鉤子的函數的相同參數。 apply_filters()必須至少有一個附加參數(被過濾的參數),但所有其他參數都是可選的。

例如,如果你想在打開 body 標籤之前註入一個分析腳本,但又不想把header.php弄得一團糟:


<?php do_action( 'before_body_tag' ); ?;>
</頭>
<身體>

然後,您可以根據需要添加任意數量的腳本:


add_action('before_body_tag', 'add_analytics_custom');
函數 add_analytics_custom() {
// <script> 標籤和分析代碼放在這裡
}

apply_filters() 的工作方式略有不同。 如上所述,過濾器用於修改值。 由於過濾器返回一個值,您將apply_filters()調用分配給一個變量:


<?php $text = apply_filters( 'call_to_action_text', '關於我們' ); ?>
<a href="<?php echo get_permalink('about'); ?>” class="button cta">
<?php echo $text; ?>
</a>

// 或者,您可以直接回顯 apply_filters() 的結果
<a href="<?php echo get_permalink('about'); ?>” class="button cta">
<?php echo apply_filters('call_to_action_text', '關於我們'); ?>
</a>

然後您可以根據需要修改過濾後的變量:


add_filter('call_to_action_text', 'change_call_to_action_text');
函數 change_call_to_action_text( $text ) {
如果(is_front_page()){
$text = '發現更多';
}

返回 $text;
}

缺點

沒有系統是完美的,鉤子也不例外。 當涉及到核心鉤子時,您通常必須使用所提供的東西。 偶爾您會遇到掛鉤不在您最方便的位置的情況。 發生這種情況時無能為力,因此請將其視為尋找創造性解決方案的機會!

此外,由於掛鉤可以存在於 WP 目錄結構中的任何位置,因此有時很難找到某些邏輯發生的位置。 這可以通過將函數掛鉤分離到它們自己的文件中來抵消。

進一步建議

  • 為鉤子創建函數時,請確保名稱唯一,否則會發生衝突。 您的自定義鉤子和過濾器名稱也是如此!
  • 使用鉤子保持模板整潔。 在整個模板中插入一些通用的do_action()掛鉤可以幫助使邏輯遠離標記(幾乎總是一個好主意)。
  • 當您安裝一個新插件時,請查看它提供了哪些鉤子並考慮如何使用它們。 這對於插件無法完全按照您的要求執行的不可避免的時間特別有用
  • 添加操作或過濾器時,您可以將函數名稱替換為函數本身。 這有助於保持操作和過濾器自包含。 不能使用remove_action()remove_filter()刪除以這種方式添加的函數,所以要小心!

add_action('where_to_do_the_thing', function() {
echo '事情完成了。';
}, 10, 1 );
  • 查看其他可用的鉤子相關函數,例如did_action()has_action() 你永遠不知道什麼時候意識到它們會有用。

概括

使用鉤子是一個習慣問題。 每當您處理 WP 項目時,嘗試問自己兩個簡單的問題:

  1. “有沒有鉤子可以讓我更輕鬆?”
  2. “我可以添加一個鉤子,讓未來的我更容易嗎?”

一旦您以這種態度接近 WP 開發,您會發現許多大門打開了。

本指南中的示例只是冰山一角。 僅 WP 核心就有數百個鉤子,更不用說龐大的插件和主題庫了。 查看 WP操作參考過濾器參考以獲取核心 WP 掛鉤的完整列表。


如果您在 Web 開發方面需要幫助,請隨時與我們聯繫。