首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

WordPress Hook(鉤子)機制深度解析:Action 與 Filter

     編輯:PHP 綜合知識

核心概念

  • Action(動作):在特定時刻「做某事」,無返回值。如 wp_head、save_post、wp_login
  • Filter(過濾器):對數據「加工並返回」,必須返回值。如 the_content、excerpt_length、wp_title

一、註冊與使用

Action 範例:404 頁面郵件通知管理員

function bing_404_notify() {
    if (!is_404()) return;
    wp_mail(get_option('admin_email'), '404 Alert', 'URL: '.home_url($_SERVER['REQUEST_URI']));
}
add_action('wp_head', 'bing_404_notify'); // 或 template_redirect 更早

Filter 範例:文章所有鏈接新視窗打開

function bing_blank_links($content) {
    return str_replace('

二、核心 API

函數用途參數
add_action($hook, $cb, $priority=10, $args=1)掛載動作優先級越小越早執行
add_filter($hook, $cb, $priority=10, $args=1)掛載過濾器回調必須返回處理後的值
do_action($hook, ...$args)觸發動作核心/主題/插件主動調用
apply_filters($hook, $value, ...$args)觸發過濾器依次傳遞返回值,最終返回
remove_action/filter($hook, $cb, $priority)移除掛載需與 add 時優先級一致
has_action/filter($hook, $cb)判斷是否掛載返回優先級或 false
doing_action/filter($hook)判斷當前是否在執行中避免遞歸調用

三、底層原理:全域 $wp_filter

// 簡化結構
$wp_filter = [
    'wp_head' => [
        10 => [ // priority
            'bing_404_notify' => ['function'=>'bing_404_notify', 'accepted_args'=>1]
        ]
    ],
    'the_content' => [
        10 => [
            'wptexturize' => [...],
            'bing_blank_links' => [...]
        ]
    ]
];
  • add_action/filter 只是向 $wp_filter[$hook][$priority][$unique_id] 寫入陣列
  • do_action 遍歷執行,忽略返回值
  • apply_filters 遍歷執行,每次將上一個返回值傳給下一個
  • Action 與 Filter 共用同一個 $wp_filter,因此名稱不能重複

四、獲取當前所有鉤子(調試用)

<pre><?php var_dump($GLOBALS['wp_filter']); ?></pre>

輸出結構可見掛載優先級、回調函數、接受參數數,利於排查衝突。

五、最佳實踐建議

  1. 優先級原則:核心功能 1-9,主題 10-19,插件 20+,晚載入插件 999
  2. 命名空間:回調函數加前綴 bing_ 或放入類靜態方法 [MyClass::class, 'method']
  3. 傳遞參數:add_filter('hook', 'cb', 10, 3) 宣告接受 3 個參數
  4. 避免匿名函數:無法用 remove_action 移除(除非保存閉包引用)
  5. 條件判斷放在回調內:if(!is_admin()) return;,而非用 if 包裹 add_action(後者會導致條件變化時掛載狀態不一致)

六、常見鉤子速查

階段ActionFilter
初始化plugins_loaded, after_setup_theme, init
請求處理parse_request, wp, template_redirectrequest, query_vars
文章操作save_post, publish_post, delete_postcontent_save_pre, the_content
用戶認證wp_login, wp_logout, user_registerauthenticate, login_redirect
前端輸出wp_head, wp_footer, wp_enqueue_scriptsthe_title, the_excerpt, widget_text

總結

Hook 是 WordPress 可擴展性的靈魂:Action 做事、Filter 改數據。掌握 add/do/apply/remove 四大動詞、優先級規則、全域 $wp_filter 結構,即可讀懂任何插件/主題核心邏輯,並編寫不衝突的擴展代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved