Verificare se un hook d'azione esiste prima di aggiungere azioni

15 nov 2012, 11:15:29
Visualizzazioni: 16.3K
Voti: 5

Sto cercando di aggiungere i tag rel=next e rel=prev all'elemento head del template image.php. Ho installato WordPress SEO e vorrei agganciarmi all'hook d'azione wpseo_head di questo plugin per ottenere questo risultato.

Quello che vorrei fare è verificare se l'hook d'azione wpseo_head esiste prima di collegarci la mia azione, e se non esiste (come nel caso in cui il plugin non sia installato o sia disattivato), usare invece wp_head.

Ho provato la funzione has_action('wpseo_head'), ma il problema è che se non ci sono funzioni collegate a questo hook restituirà false anche se il plugin è installato e attivo.

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

Qual è il modo corretto per verificare l'esistenza di azioni che potrebbero non esistere in WordPress?

Grazie.

0
Tutte le risposte alla domanda 4
1

Non puoi verificare se un'azione verrà chiamata prima che ciò accada. Anche se ci fossero già callback collegati all'azione, non ci sarebbe alcuna garanzia che verrà utilizzato il corrispondente do_action().

Nel tuo caso, testa con is_plugin_active():

if ( is_plugin_active( 'wordpress-seo/wp-seo.php' ) )
{
    // fai qualcosa
}

Come menziona @Barry Carlyon nei commenti, la directory può essere rinominata. Potresti verificare se una costante o una classe è stata definita/dichiarata. Ma non esiste una soluzione al 100%: costanti, funzioni o classi potrebbero cambiare dopo un aggiornamento, oppure un altro plugin potrebbe aver già definito queste costanti. Soprattutto in questo caso: esiste un altro plugin WP SEO disponibile (non ho mai capito perché abbia usato un nome già in uso...), e potresti ottenere un falso positivo.

Esiste la funzione get_file_data(). Ecco del pseudo-codice, non testato:

$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 )
{
    // fai qualcosa
}

E questo ancora non è sicuro: i nomi possono essere cambiati.

15 nov 2012 11:22:43
Commenti

Un modo migliore rispetto a provare a utilizzare il percorso del plugin è verificare la presenza di costanti (o classi) create da wp-seo, perché se installassi wordpress-seo potrei non inserirlo nella cartella wordpress-seo. Ma in questo caso wp_head dovrebbe sempre funzionare come hook poiché wpseo_head dovrebbe chiamare wp_head

Barry Carlyon Barry Carlyon
15 nov 2012 12:09:08
0

Ho trovato questa risposta che in parte risponde alla domanda,

// verifica l'esistenza del filtro "some_hook_filter"
if( array_key_exists( 'some_hook_filter' , $GLOBALS['wp_filter']) ) {
  //esegui il tuo codice qui
}

Tuttavia, come notato dall'autore originale, questo non mostrerà tutti i filtri possibili a seconda del momento in cui il codice viene eseguito. Ad esempio, i filtri aggiunti dal tema non saranno visibili durante il caricamento dei plugin. Sia i filtri che le azioni sono inclusi in questo array.

Ho trovato una lista delle variabili di WP memorizzate nell'array $GLOBALS.

2 mag 2016 09:20:09
0

Non puoi verificare in modo affidabile se un'azione esiste.

Perché l'unico momento in cui l'azione esiste è quando viene chiamato do_action o qualcun altro aggiunge azioni ad essa.

Quindi l'azione esiste solo quando qualcuno aggiunge un'azione ad essa, o quando l'azione viene chiamata.

E se qualcuno aggiunge azioni, non garantisce che l'azione verrà mai chiamata.

Un grande problema che alcuni sviluppatori di plugin possono incontrare è fare affidamento sull'azione wp_head, ma un tema mal costruito non chiamerà l'azione wp_head!

15 nov 2012 12:07:02
0

Dovresti utilizzare la funzione has_action.

Funzione

has_action( string $hook_name, callable|false $callback = false )

Questa funzione verifica se è stata registrata un'azione per un hook.

Parametri

$hook_name (string) (Obbligatorio) Il nome dell'hook dell'azione.

$callback (callable|false) (Opzionale) La callback da verificare. Valore predefinito: false

Ulteriori informazioni

Per maggiori informazioni consulta il sito WP Code Reference: has_action

8 set 2021 12:34:18