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
);二、参数详解
$hook_name(必填)
要绑定的动作钩子名称,可以是:- WordPress内置动作钩子(如
init、wp_head、save_post等); - 自定义动作钩子(通过
do_action('自定义钩子名')手动触发)。 - 常用内置动作钩子
- WordPress内置动作钩子(如
| 钩子名称 | 触发时机 |
|---|---|
init | WordPress初始化完成后 |
wp_head | <head>标签内输出内容时 |
wp_footer | 页面底部</body>前输出时 |
save_post | 文章/页面保存或更新时 |
admin_init | 后台管理界面初始化时 |
after_setup_theme | 主题加载完成后 |
admin_bar_menu | 在管理工具栏渲染阶段注入、修改或移除菜单项目 |
$callback(必填)
动作触发时要执行的回调函数/方法,支持:- 普通函数名(字符串形式);
- 类方法(如
array( '类名', '方法名' )或array( $对象实例, '方法名' )); - 匿名函数(PHP 5.3+);
- 闭包或可调用对象。
$priority(可选,默认10)
执行优先级:数字越小,回调函数越先执行;数字越大,越晚执行。- 多个函数绑定到同一个钩子时,优先级决定执行顺序;
- 相同优先级按绑定顺序执行。
$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 );五、注意事项
- 优先级冲突:若多个函数绑定到同一钩子,注意优先级设置,避免逻辑覆盖。
- 参数数量匹配:
accepted_args需与do_action()传递的参数数一致,否则回调函数无法接收全部参数。 - 移除动作:可通过
remove_action()移除已绑定的动作,参数需与add_action()完全一致(包括优先级和参数数):phpremove_action( 'wp_head', 'my_custom_wp_head', 10 ); - 与过滤器的区别:动作钩子(
add_action)仅执行操作,无返回值;过滤器(add_filter)需返回修改后的值(如修改文章内容)。