Verificare se un hook d'azione esiste prima di aggiungere azioni
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.
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.

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

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.

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!

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
