可以通过两种方式使用WordPress钩子:
使用回调函数名称和适当的函数
add_action( 'action_name', 'callback_function_name' );
function callback_function_name() {
// do something
}
使用匿名函数(闭包)
add_action( 'action_name', function() {
// do something
} );
WordPress有什么不同之处?什么是首选方式和原因?
答案 0 :(得分:30)
匿名功能的缺点是您无法使用remove_action删除操作。
重要说明:要删除挂钩,添加挂钩时$function_to_remove
和$priority
参数必须匹配。这适用于过滤器和操作。删除失败时不会发出警告。
因为您没有定义function_to_remove
,所以您无法删除它。
所以你不应该在其他人可能想要覆盖的插件或主题中使用它。
答案 1 :(得分:15)
使用闭包具有保持全局命名空间清洁的好处,因为您不必首先创建全局函数作为回调传递。
add_action('admin_init', function () {
// some code...
});
我个人更喜欢使用闭包作为回调,除非:
闭包也可以在类中有益。
class SomeClass
{
public function __construct()
{
add_action('wp_head', function () {
$this->addSomeStyling();
});
}
protected function addSomeStyling()
{
echo '<style> body { color: #999; } </style>';
}
}
通常需要将回复方法设为 public ,但在这种情况下,您还可以将它们设为私有或受保护。
此解决方案仅适用于PHP 5.4+。为了使它适用于PHP 5.3,您需要显式地将$this
对象引用传递给闭包,例如:
public function __construct()
{
$self = $this;
add_action('wp_head', function () use ($self) {
$self->addSomeStyling();
});
}
答案 2 :(得分:0)
更准确地说,我想从 current wordpress docs;实际演示这如何取决于用例:
“为什么我们在这里使用命名函数[作为ajax动作钩子的回调][...]?因为PHP最近才支持闭包。[...]因为有些人可能仍在运行旧版本在 PHP 中,我们总是使用命名函数以获得最大的兼容性。如果你有一个最新的 PHP 版本并且只是为了你自己的安装而开发,如果你愿意,可以继续使用闭包。”