it-swarm.com.de

Überprüfen Sie, ob ein Aktions-Hook vorhanden ist, bevor Sie ihm Aktionen hinzufügen

Ich versuche, ein rel=next- und ein rel=prev-Link-Tag zum head-Element der image.php-Vorlagendatei hinzuzufügen. Ich habe Wordpress SEO installiert und ich mag es, mich an diesen Plugin wpseo_head action hook zu binden, um das zu erreichen.

Was ich tun möchte, ist zu überprüfen, ob der Aktions-Hook wpseo_head vorhanden ist, bevor ich meine Aktion an ihn anhänge. Wenn dies nicht der Fall ist, wenn das Plugin nicht installiert oder deaktiviert ist, würde ich stattdessen wp_head verwenden.

Ich habe die Funktion has_action('wpseo_head') ausprobiert, aber das Problem dabei ist, dass false zurückgegeben wird, wenn keine Funktionen mit diesem Hook verbunden sind, auch wenn das Plugin aktiviert installiert ist.

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

Auf welche Weise können Sie nach Aktionen suchen, die in Wordpress möglicherweise nicht vorhanden sind?

Vielen Dank.

3
Ahmad M

Sie können nicht prüfen, ob zuvor eine Aktion aufgerufen wird. Selbst wenn bereits Rückrufe an die Aktion angehängt wurden, kann nicht garantiert werden, dass die entsprechende do_action() verwendet wird.

Testen Sie in Ihrem Fall 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 Klasse definiert/deklariert wurde. Es gibt jedoch keine 100% ige Lösung: Konstanten, Funktionen oder Klassen können sich nach einem Upgrade ändern, oder ein anderes Plugin definiert diese Konstanten bereits. Besonders in diesem Fall: Es ist ein weiteres WP SEO-Plugin verfügbar (ich habe nie verstanden, warum er einen Namen verwendet hat, der bereits verwendet wurde…), und Sie könnten eine falsch positive Übereinstimmung erhalten.

Es gibt die Funktion get_file_data(). Einige Pseudocodes, die nicht getestet wurden:

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

4
fuxia

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 der ursprüngliche Mitwirkende feststellt, werden dadurch jedoch nicht alle möglichen Filter aktiviert, je nachdem, wann der Code ausgeführt wird. Von Themen unterstützte Filter werden zum Beispiel beim Laden des Plugins nicht angezeigt. In diesem Array sind sowohl Filter als auch Aktionen enthalten.

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

0
Aurovrata

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

Da die Aktion nur dann vorhanden ist, wenn do_action aufgerufen wird oder eine andere Person Aktionen hinzufügt.

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

Und wenn jemand Aktionen hinzufügt, kann dies nicht garantieren, dass die Aktion überhaupt aufgerufen wird.

Ein großes Problem, das manche Plugin-Entwickler haben können, ist die Verwendung der Aktion wp_head, aber ein schlecht erstelltes Thema ruft die Aktion wp_head nicht auf!

0
Barry Carlyon