如何从活动主题获取所有预定义的do_action()调用

时间:2015-04-18 作者:Mayeenul Islam

为了将我的插件内容连接到任何地方,假设我让主题开发人员创建自己的带有前缀的挂钩(pre_) 在他们主题的任何地方,我都不知道钩子的其他部分。那么他们会怎么做呢?

假设,在single.php 他们放置了一个钩子,如:

do_action( \'pre_kauwa\' );
在中page.php 他们放置了一个钩子,如:

do_action( \'pre_kala\' );
等等。。。

我怎样才能得到这些do_action() 带前缀的声明pre_ 从活动WordPress安装(活动主题)
or,
从活动的WordPress视口(post、page、archive-bla-bla)

。。。这样,我就可以动态地创建一个钩子列表,其中可以使用add_action()?

正在测试

英寸wp-includes/plugin.php 我找到了has_filter() 函数声明。从那里开始,我进行了以下测试:

$wp_filter = $GLOBALS[\'wp_filter\'];
$has = ! empty( $wp_filter[ $tag ] );
在我的虚拟主题中index.php 之后the_content() (在循环中)我放置:

do_action( \'pre_kk\' );
就在do_action() 我拨打的电话:

$t_test = $GLOBALS[\'wp_filter\'];
$hk = \'pre_kk\';
var_dump( $t_test[$hk] );
但它抛出了一个未定义的索引。

1 个回复
SO网友:Nathan Johnson

pre_ 是一个很糟糕的前缀,因为它会干扰所有以pre_.

但是,如果您想获取某个页面上调用的所有操作和筛选器的名称,可以使用all 钩子,它将回调添加到每个钩子。显然,这非常昂贵,所以您不想在生产服务器上进行。

add_action( \'all\', \'wpse_all_actions\' );
function wpse_all_actions() {
  static $pre = [];
  $filter = current_filter();
  if( \'pre_\' === substr( $filter, 0, 4 ) ) {
    $pre[] = $filter;
  }
  if( \'shutdown\' === $filter ) {
    var_dump( $pre );
  }
}

结束

相关推荐

Adding custom Bulk Actions

我一直在寻找将自定义批量操作添加到类别页面的方法。他们中的大多数人说,不可能用干净的方式来做这件事,因为这件事没有挂钩。大多数解决方案包括在客户端使用JS通过DOM操作添加选项。虽然这是可行的,但它仍然是一个相当丑陋的解决方案。我读过的大多数文章都是2年前的,所以我一直在想,从那时起到现在,这个问题已经添加了一个新的挂钩或解决方案,以便对这个问题有一个更及时的解决方案。