Überprüfen Sie, ob der Aktionshaken vorhanden ist, bevor Sie Aktionen hinzufügen

Ich versuche, ein rel=next und rel=prev Link Tags zum image.php der image.php Template Datei image.php . Ich habe WordPress SEO installiert und ich wpseo_head gerne an diesem Plugin wpseo_head Action Hook, um das zu erreichen.

Was ich tun möchte, ist zu überprüfen, ob der wpseo_head vorhanden ist, bevor ich meine Aktion daran wpseo_head , und wenn nicht wie im Fall des Plugins nicht installiert oder deaktiviert wird, würde wp_head stattdessen wp_head verwenden.

Ich habe versucht, has_action('wpseo_head') -function, aber das Problem damit ist, wenn keine functionen an diesen Haken angeschlossen sind, wird false auch wenn das Plugin installiert ist aktiviert.

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

Wie kann man nach Aktionen suchen, die in WordPress nicht vorhanden sind?

Vielen Dank.

Solutions Collecting From Web of "Überprüfen Sie, ob der Aktionshaken vorhanden ist, bevor Sie Aktionen hinzufügen"

Sie können nicht prüfen, ob zuvor eine Aktion aufgerufen wird. Selbst wenn bereits Callbacks an die Aktion angehängt wären, gäbe es keine Garantie dafür, dass die passende do_action() verwendet wird.

In Ihrem Fall testen Sie mit is_plugin_active() :

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

Wie @Barry Carlyon in den Kommentaren erwähnt, kann das Verzeichnis umbenannt werden. Sie könnten prüfen, ob eine Konstante oder eine class definiert wurde. Aber es gibt keine 100% Lösung: Konstanten, functionen oder classn können sich nach einem Upgrade ändern, oder ein anderes Plugin definiert diese Konstanten bereits. Besonders in diesem Fall: Es gibt ein anderes WP SEO Plugin (ich habe nie verstanden, warum er einen Namen benutzt hat, der bereits benutzt wurde …), und Sie könnten eine falsch positive Übereinstimmung erhalten.

Es gibt die function get_file_data() . Ein Pseudo-Code, nicht getestet:

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

Und das ist immer noch nicht sicher: Namen können geändert werden.

Sie können nicht überprüfen, ob eine Aktion zuverlässig besteht.

Weil die Aktion nur dann ausgeführt wird, wenn do_action aufgerufen wird oder jemand anderes Aktionen hinzufügt.

Die Aktion existiert also nur, wenn jemand eine Aktion hinzufügt oder die Aktion aufgerufen wird.

Und wenn jemand Aktionen hinzufügt, garantiert das nicht, dass die Aktion überhaupt aufgerufen wird.

Ein großes Problem, das einige Plugin-Entwickler haben können, beruht auf der wp_head-Aktion, aber ein schlecht gebautes Thema ruft die wp_head-Aktion nicht auf!

Ich fand diese Antwort teilweise die Frage,

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

Wie jedoch von dem ursprünglichen Mitwirkenden bemerkt wurde, wird dies nicht alle möglichen Filter aufzeigen, abhängig davon, wann der Code ausgeführt wird. Von einem Theme beigetragene Filter werden zum Beispiel beim Laden des Plugins nicht angezeigt. Beide Filter und Aktionen sind in diesem Array enthalten.

Ich habe eine Liste von WP-Variablen gefunden, die im Array $ GLOBALS gespeichert sind.