web-dev-qa-db-fra.com

Vérifier si le crochet d'action existe avant d'y ajouter des actions

J'essaie d'ajouter une balise de lien rel=next et rel=prev à l'élément head du fichier de modèle image.php. J'ai installé Wordpress SEO et j'aime bien accrocher ce crochet wpseo_head action pour y parvenir.

Ce que je voudrais faire est de vérifier si le hook d’action wpseo_head existe avant d’y attacher mon action. Si tel n’est pas le cas, si le plug-in n’est pas installé ou désactivé, j’utiliserais plutôt wp_head.

J'ai essayé la fonction has_action('wpseo_head'), mais le problème avec cela est que s'il n'y a aucune fonction attachée à ce hook, il retournera false même si le plugin est installé activé.

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

Quel est le moyen de vérifier les actions qui pourraient ne pas exister dans Wordpress?

Merci.

3
Ahmad M

Vous ne pouvez pas vérifier si une action sera appelée avant que cela se produise. Même s'il y avait déjà des rappels attachés à l'action, il n'y aurait aucune garantie que la do_action() correspondante sera utilisée.

Dans votre cas, testez avec is_plugin_active():

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

Comme @Barry Carlyon le mentionne dans les commentaires, le répertoire peut être renommé. Vous pourriez vérifier si une constante ou une classe a été définie/déclarée. Mais il n'y a pas de solution à 100%: les constantes, les fonctions ou les classes peuvent changer après une mise à niveau, ou un autre plugin définit déjà ces constantes. Surtout dans ce cas: Il y a un autre WP plug-in SEO disponible (je n'ai jamais compris pourquoi il utilisait un nom déjà utilisé…), et vous pourriez obtenir un faux résultat positif.

Il y a la fonction get_file_data(). Quelques pseudo-codes, non testés:

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

Et ce n’est toujours pas sûr: les noms peuvent être changés.

4
fuxia

J'ai trouvé cette réponse en partie la question,

// check for the existence of "some_hook_filter" filter
if( array_key_exists( 'some_hook_filter' , $GLOBALS['wp_filter']) ) {
  //do your code here
}

Toutefois, comme l’a noté le contributeur original, cela n’affiche pas tous les filtres possibles en fonction de l’exécution du code. Les filtres fournis par thème ne seront pas affichés au moment du chargement du plugin, par exemple. Les filtres et les actions sont inclus dans ce tableau.

J'ai trouvé une liste de WP variables stockées dans le tableau $ GLOBALS.

0
Aurovrata

Vous ne pouvez pas vérifier si une action existe de manière fiable.

Parce que le seul moment où l'action existe est le moment où do_action est appelée ou quelqu'un d'autre y ajoute des actions.

Ainsi, l'action n'existe que lorsque quelqu'un y ajoute une action ou que l'action est appelée.

Et si quelqu'un ajoute des actions, cela ne garantit pas que l'action sera appelée du tout.

Un gros problème que certains développeurs de plugins peuvent avoir est de compter sur l'action wp_head, mais un thème mal construit n'appellera pas l'action wp_head!

0
Barry Carlyon