wp_head、save_post、wp_loginthe_content、excerpt_length、wp_titlefunction 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 更早
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 遍歷執行,每次將上一個返回值傳給下一個$wp_filter,因此名稱不能重複<pre><?php var_dump($GLOBALS['wp_filter']); ?></pre>
輸出結構可見掛載優先級、回調函數、接受參數數,利於排查衝突。
bing_ 或放入類靜態方法 [MyClass::class, 'method']add_filter('hook', 'cb', 10, 3) 宣告接受 3 個參數remove_action 移除(除非保存閉包引用)if(!is_admin()) return;,而非用 if 包裹 add_action(後者會導致條件變化時掛載狀態不一致)| 階段 | Action | Filter |
|---|---|---|
| 初始化 | plugins_loaded, after_setup_theme, init | |
| 請求處理 | parse_request, wp, template_redirect | request, query_vars |
| 文章操作 | save_post, publish_post, delete_post | content_save_pre, the_content |
| 用戶認證 | wp_login, wp_logout, user_register | authenticate, login_redirect |
| 前端輸出 | wp_head, wp_footer, wp_enqueue_scripts | the_title, the_excerpt, widget_text |
Hook 是 WordPress 可擴展性的靈魂:Action 做事、Filter 改數據。掌握 add/do/apply/remove 四大動詞、優先級規則、全域 $wp_filter 結構,即可讀懂任何插件/主題核心邏輯,並編寫不衝突的擴展代碼。