Verifică dacă un hook de acțiune există înainte de a adăuga acțiuni la el în WordPress

15 nov. 2012, 11:15:29
Vizualizări: 16.3K
Voturi: 5

Î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.

0
Toate răspunsurile la întrebare 4
1

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.

15 nov. 2012 11:22:43
Comentarii

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

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

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.

2 mai 2016 09:20:09
0

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!

15 nov. 2012 12:07:02
0

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

8 sept. 2021 12:34:18