Skip to content

add_action() 函数详解

在WordPress开发中,add_action()动作钩子(Action Hooks) 的核心函数,用于将自定义函数(或方法)绑定到WordPress执行流程中的特定“动作点”。当WordPress触发该动作点(通过do_action()函数)时,绑定的自定义函数会自动执行,从而实现对WordPress默认流程的扩展或修改,无需修改核心代码。

一、函数语法

php
add_action(
    string $hook_name,
    callable $callback,
    int $priority = 10,
    int $accepted_args = 1
);

二、参数详解

  1. $hook_name(必填)
    要绑定的动作钩子名称,可以是:
    • WordPress内置动作钩子(如initwp_headsave_post等);
    • 自定义动作钩子(通过do_action('自定义钩子名')手动触发)。
    • 常用内置动作钩子
钩子名称触发时机
initWordPress初始化完成后
wp_head<head>标签内输出内容时
wp_footer页面底部</body>前输出时
save_post文章/页面保存或更新时
admin_init后台管理界面初始化时
after_setup_theme主题加载完成后
admin_bar_menu在管理工具栏渲染阶段注入、修改或移除菜单项目
  1. $callback(必填)
    动作触发时要执行的回调函数/方法,支持:

    • 普通函数名(字符串形式);
    • 类方法(如array( '类名', '方法名' )array( $对象实例, '方法名' ));
    • 匿名函数(PHP 5.3+);
    • 闭包或可调用对象。
  2. $priority(可选,默认10)
    执行优先级:数字越小,回调函数越先执行;数字越大,越晚执行。

    • 多个函数绑定到同一个钩子时,优先级决定执行顺序;
    • 相同优先级按绑定顺序执行。
  3. $accepted_args(可选,默认1)
    回调函数能接收的参数数量,需与do_action()触发钩子时传递的参数数量匹配。

三、核心原理

WordPress的动作钩子系统基于“发布-订阅”模式:

  • do_action('钩子名', 参数1, 参数2...):发布(触发)动作;
  • add_action('钩子名', 回调函数):订阅动作,等待触发时执行回调。

四、使用示例

1. 基础示例:在页面头部添加自定义代码

绑定到wp_head钩子(WordPress渲染<head>标签时触发):

php
// 定义自定义函数
function my_custom_wp_head() {
    echo '<meta name="author" content="豆包编程助手">';
}
// 绑定到wp_head钩子,优先级10,接收1个参数(默认)
add_action( 'wp_head', 'my_custom_wp_head' );

2. 带参数的示例:监听文章保存动作

save_post钩子会传递3个参数:$post_id(文章ID)、$post(文章对象)、$update(是否为更新):

php
function my_save_post_handler( $post_id, $post, $update ) {
    // 仅处理文章类型为post的内容
    if ( 'post' === $post->post_type ) {
        update_post_meta( $post_id, 'saved_time', current_time('timestamp') );
    }
}
// 优先级20,接收3个参数(需与do_action传递的参数数一致)
add_action( 'save_post', 'my_save_post_handler', 20, 3 );

3. 类方法示例:面向对象方式绑定

php
class My_Action_Class {
    public function __construct() {
        // 绑定类内方法到init钩子
        add_action( 'init', array( $this, 'init_handler' ) );
    }

    public function init_handler() {
        // 初始化自定义文章类型等操作
        register_post_type( 'book', array( 'labels' => array( 'name' => '图书' ), 'public' => true ) );
    }
}

// 实例化类,触发绑定
new My_Action_Class();

4. 自定义钩子示例:手动触发动作

php
// 自定义钩子:my_custom_hook
do_action( 'my_custom_hook', '参数1', '参数2' );

// 绑定自定义钩子的回调
add_action( 'my_custom_hook', function( $arg1, $arg2 ) {
    echo "自定义钩子触发,参数:$arg1, $arg2";
}, 10, 2 );

五、注意事项

  1. 优先级冲突:若多个函数绑定到同一钩子,注意优先级设置,避免逻辑覆盖。
  2. 参数数量匹配accepted_args需与do_action()传递的参数数一致,否则回调函数无法接收全部参数。
  3. 移除动作:可通过remove_action()移除已绑定的动作,参数需与add_action()完全一致(包括优先级和参数数):
    php
    remove_action( 'wp_head', 'my_custom_wp_head', 10 );
  4. 与过滤器的区别:动作钩子(add_action)仅执行操作,无返回值;过滤器(add_filter)需返回修改后的值(如修改文章内容)。

Designed & Powerd by liujun