Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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.

share|improve this question
add comment

2 Answers

up vote 2 down vote accepted

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.

share|improve this answer
    
Thanks @toscho, I guess this is the best way to do that. It would be handy though to have something like action_exists() or filter_exists() especially when you declare your own hooks and need to make sure they are unique. –  Ahmad M Nov 15 '12 at 10:04
    
A better way than trying to use the path to the plugin is to test for any constants that wp-seo creates (or classes), because if I installed wordpress-seo I might not put it in the wordpress-seo folder. But in this case wp_head should always work to hook on as wpseo_head should call wp_head –  Barry Carlyon Nov 15 '12 at 10:09
add comment

You can't check to see if a action exists reliably.

Because the only time the action exists is when to do_action is called or someone else adds actions to it.

So the action only exists when someone adds a action to it, or the action is called.

And if someone adds actions, it doesn't guarantee the action will be called at all.

A large problem some plugin developers can have is relying on the wp_head action, but a poorly built theme, won't call the wp_head action!

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.