在向其添加操作之前,请检查操作挂接是否存在

时间:2012-11-15 作者:Ahmad M

我正在尝试添加rel=nextrel=prev 将标记链接到的head元素image.php 模板文件。我已经安装了Wordpress SEO,我想挂接这个插件wpseo_head 实现这一目标的行动挂钩。

我想做的是检查wpseo_head 动作挂钩在我将动作附加到它之前就已经存在,如果插件没有安装或停用,我会使用wp_head 相反

我试过了has_action(\'wpseo_head\') 函数,但问题是如果没有附加到此挂钩的函数,它将返回false 即使插件已激活安装。

if (has_action(\'wpseo_head\')) {
    add_action(\'wpseo_head\', \'ad_add_link_tag_image_head\');
} else {
    add_action(\'wp_head\', \'ad_add_link_tag_image_head\');
}
检查Wordpress中可能不存在的操作的方法是什么?

谢谢

4 个回复
最合适的回答,由SO网友:fuxia 整理而成

您无法检查是否会在该操作发生之前调用该操作。即使操作已经附加了回调,也不能保证匹配do_action() 将使用。

在您的情况下,请使用is_plugin_active():

if ( is_plugin_active( \'wordpress-seo/wp-seo.php\' ) )
{
    // do something
}
正如@BarryCarlyon在评论中提到的,该目录可以重命名。您可以检查是否定义/声明了常量或类。但并没有百分之百的解决方案:常量、函数或类在升级后可能会改变,或者其他插件已经定义了这些常量。尤其是在这种情况下:有another WP SEO plugin 可用(我从不理解他为什么使用一个已经在使用的名称…),你可能会得到一个假阳性匹配。

有功能get_file_data(). 一些未测试的伪代码:

$wpseo_active = FALSE;
$plugins = get_option( \'active_plugins\', array() );

foreach ( $plugins as $plugin )
{
    if ( FALSE !== stripos( $plugin, \'wp-seo\' )
    {
        $data = get_file_data( WP_PLUGIN_DIR . "$plugin" , array ( \'Author\' ) );
        if ( \'Joost de Valk\' === $data[0] )
        {
            $wpseo_active = TRUE;
        }
    }
}

if ( $wpseo_active )
{
    // do something
}
但这仍然不安全:名称可以更改。

SO网友:Barry Carlyon

您无法检查动作是否可靠存在。

因为动作存在的唯一时间是何时调用to do\\u动作或其他人向其添加动作。

因此,只有当有人向其添加操作或调用该操作时,该操作才存在。

如果有人添加了动作,这并不能保证动作会被调用。

一些插件开发人员可能会遇到的一个大问题是依赖于wp\\u head操作,但构建糟糕的主题不会调用wp\\u head操作!

SO网友:Aurovrata

我发现this answer 部分原因是,

// check for the existence of "some_hook_filter" filter
if( array_key_exists( \'some_hook_filter\' , $GLOBALS[\'wp_filter\']) ) {
  //do your code here
}
然而,正如最初的贡献者所指出的,这不会根据代码的执行时间显示所有可能的过滤器。例如,主题贡献过滤器不会在插件加载时显示。过滤器和操作都包含在此数组中。

我找到了一个list $GLOBALS数组中存储的WP变量的个数。

SO网友:D.A.H

您应该使用函数has_action.

功能

has_action( string $hook_name, callable|false $callback = false )
此函数检查是否为挂钩注册了任何操作。

参数

$hook_name(string)(必需)动作挂钩的名称。

$callback(callable | false)(可选)要检查的回调。默认值:false

更多信息请查看WP代码参考网站:has_action

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $