Verifică dacă un hook de acțiune există înainte de a adăuga acțiuni la el în WordPress
Încerc să adaug tag-uri de link rel=next
și rel=prev
în elementul head al fișierului de template image.php
. Am instalat Wordpress SEO și doresc să folosesc hook-ul de acțiune wpseo_head
al acestui plugin pentru a realiza acest lucru.
Ceea ce aș dori să fac este să verific dacă hook-ul de acțiune wpseo_head
există înainte de a atașa acțiunea mea la el, iar dacă nu există (de exemplu cazul în care plugin-ul nu este instalat sau este dezactivat), să folosesc wp_head
în schimb.
Am încercat funcția has_action('wpseo_head')
, dar problema este că dacă nu există funcții atașate la acest hook, va returna false
chiar dacă plugin-ul este instalat și activat.
if (has_action('wpseo_head')) {
add_action('wpseo_head', 'ad_add_link_tag_image_head'); // Adaugă acțiunea la wpseo_head dacă există
} else {
add_action('wp_head', 'ad_add_link_tag_image_head'); // Folosește wp_head ca alternativă
}
Care este modalitatea corectă de a verifica existența acțiunilor care pot să nu existe în WordPress?
Mulțumesc.
Nu poți verifica dacă o acțiune va fi apelată înainte ca aceasta să se întâmple. Chiar dacă ar exista deja callback-uri atașate acțiunii, nu ar există nicio garanție că va fi folosit do_action()
corespunzător.
În cazul tău, testează cu is_plugin_active()
:
if ( is_plugin_active( 'wordpress-seo/wp-seo.php' ) )
{
// fă ceva
}
Așa cum menționează @Barry Carlyon în comentarii, directorul poate fi redenumit. Ai putea verifica dacă o constantă sau o clasă au fost definite/declarate. Dar nu există o soluție 100% sigură: Constantele, funcțiile sau clasele se pot schimba după o actualizare, sau un alt plugin poate defini deja aceste constante. Mai ales în acest caz: Există un alt plugin WP SEO disponibil (nu am înțeles niciodată de ce a folosit un nume care era deja folosit…), și ai putea obține o potrivire fals pozitivă.
Există funcția get_file_data()
. Un pseudo-cod, netestat:
$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 )
{
// fă ceva
}
Și chiar și așa nu este sigur: Numele pot fi schimbate.

O metodă mai bună decât încercarea de a folosi calea către plugin este testarea pentru orice constante pe care wp-seo le creează (sau clase), deoarece dacă aș instala wordpress-seo, s-ar putea să nu-l pun în directorul wordpress-seo. Dar în acest caz, wp_head ar trebui să funcționeze întotdeauna ca punct de legătură, deoarece wpseo_head ar trebui să apeleze wp_head

Am găsit acest răspuns care răspunde parțial la întrebare,
// verifică existența filtrului "some_hook_filter"
if( array_key_exists( 'some_hook_filter' , $GLOBALS['wp_filter']) ) {
//execută codul tău aici
}
Totuși, după cum a observat și autorul original, această metodă nu va găsi toate filtrele posibile, în funcție de momentul în care codul este executat. De exemplu, filtrele adăugate de teme nu vor fi vizibile în momentul în care plugin-urile se încarcă. Atât filtrele cât și acțiunile sunt incluse în acest array.
Am găsit o listă cu variabilele WP stocate în array-ul $GLOBALS.

Nu poți verifica în mod fiabil dacă o acțiune există.
Pentru că singura dată când acțiunea există este atunci când este apelată funcția do_action sau când cineva adaugă acțiuni la ea.
Deci acțiunea există doar atunci când cineva adaugă o acțiune la ea sau când acțiunea este apelată.
Și dacă cineva adaugă acțiuni, acest lucru nu garantează că acțiunea va fi apelată vreodată.
O problemă majoră pe care o pot avea unii dezvoltatori de plugin-uri este dependența de acțiunea wp_head, dar o temă prost construită nu va apela acțiunea wp_head!

Ar trebui să utilizați funcția has_action
.
Funcție
has_action( string $hook_name, callable|false $callback = false )
Această funcție verifică dacă orice acțiune a fost înregistrată pentru un cârlig (hook).
Parametri
$hook_name (string) (Obligatoriu) Numele cârligului de acțiune.
$callback (callable|false) (Opțional) Funcția de callback de verificat. Valoare implicită: false
Mai multe informații
Pentru mai multe informații, verificați site-ul WP Code Reference: has_action
