I am trying to add a rel=next and rel=prev link tags to the head element of image.php template file. I have WordPress SEO installed and I like to hook to this plugin wpseo_head action hook to achieve that.

What I would like to do is to check if the wpseo_head action hook exists before I attach my action to it, and if not like in the case of the plugin is not installed or deactivated, I would use wp_head instead.

I have tried has_action('wpseo_head') function, but the problem with that is if there are no functions attached to this hook it will return false even if the plugin is installed activated.

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');
}

What is the way to check for actions that may not exist in WordPress?

Thanks.

4 Answers
4

You cannot check if an action will be called before that happens. Even if there were already callbacks attached to the action there would be no guarantee the matching do_action() will be used.

In your case, test with is_plugin_active():

if ( is_plugin_active( 'wordpress-seo/wp-seo.php' ) )
{
    // do something
}

As @Barry Carlyon mentions in the comments, the directory can be renamed. You could check if a constant or a class has been defined/declared. But there is not 100% solution: Constants, functions or classes may change after an upgrade, or another plugin defines these constants already. Especially in this case: There is another WP SEO plugin available (I never understood why he used a name that was already in use …), and you could get a false positive match.

There is the function get_file_data(). Some pseudo-code, not tested:

$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
}

And that is still not safe: Names can be changed.

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *