WordPress 插件機制的核心是「鉤子系統」,分為動作與過濾器。本文專注於動作鉤子:
add_action( string $hook, callable $function_to_add, int $priority = 10, int $accepted_args = 1 ): bool
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
| $hook | string | 是 | 動作名稱,如 wp_head、init、save_post |
| $function_to_add | callable | 是 | 回調函數名(字符串)或匿名函數 |
| $priority | int | 否 | 執行優先級,數值越小越先執行,默認 10 |
| $accepted_args | int | 否 | 回調接收的參數數量,默認 1 |
始終返回 true。
<head> 輸出 viewport meta 標籤function my_theme_viewport_meta() {
echo '<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />';
}
add_action('wp_head', 'my_theme_viewport_meta');
function notify_on_publish(int $post_id) {
$post = get_post($post_id);
if ($post->post_status === 'publish') {
wp_mail('admin@example.com', '新文章發布', $post->post_title);
}
}
// save_post 動作傳遞 $post_id,$accepted_args 必須 >= 1
add_action('save_post', 'notify_on_publish', 10, 1);
add_action('wp_footer', function() {
echo '<!-- Footer injected at priority 5 -->';
}, 5); // 比默認 10 更早執行
do_action( string $hook, mixed ...$args ): void
$hook:動作名稱(必須與 add_action 的 $hook 一致)...$args:任意數量參數,將透傳給所有掛載的回調函數apply_filters 有返回值,用於數據修改;do_action 無返回值,用於事件通知// functions.php 或插件中定義
function my_theme_before_template() {
do_action('my_theme_before_template', get_queried_object_id());
}
// 模板文件 page.php 頂部調用
my_theme_before_template();
add_action('my_theme_before_template', function($post_id) {
// 記錄頁面瀏覽統計
update_post_meta($post_id, 'view_count', get_post_meta($post_id, 'view_count', true) + 1);
}, 10, 1);
init 初始化// WordPress 核心在 wp-settings.php 中調用
do_action('init'); // 無參數
// 常見掛載:註冊自定義文章類型、分類法、腳本樣式
add_action('init', 'my_register_post_types');
| 鉤子名 | 觸發時機 | 典型用途 | 傳遞參數 |
|---|---|---|---|
| muplugins_loaded | Must-use 插件加載後 | 極早期初始化 | 無 |
| plugins_loaded | 所有插件加載後 | 註冊 CPT、Taxonomy、載入文本域 | 無 |
| init | WP 初始化完成 | 註冊類型、重寫規則、驗證用戶 | 無 |
| wp_loaded | 完整加載完成 | 處理表單提交、重定向 | 無 |
| wp_head | 前台 <head> 輸出時 | SEO meta、CSS/JS 內聯 | 無 |
| wp_footer | 前台 </body> 前 | 分析碼、彈窗、延遲腳本 | 無 |
| save_post | 文章保存/發布/更新 | 同步數據、發送通知、清理緩存 | $post_id, $post, $update |
| delete_post | 文章永久刪除前 | 清理關聯數據、文件 | $post_id |
| admin_init | 後台初始化 | 註冊設置頁面、處理後台表單 | 無 |
| admin_menu | 後台菜單構建 | 添加頂級/子菜單頁面 | 無 |
$accepted_args 必須 ≥ 實際使用的參數數,否則回調接收不到後續參數。myplugin/action_name 防衝突。remove_action($hook, $function, $priority) 需精確匹配優先級。wp_head),否則可能破壞 JSON/AJAX 響應。兩個函數均定義於 wp-includes/plugin.php,核心實現約 50 行,建議閱讀源碼深入理解 WP_Hook 類機制。