web-dev-qa-db-ger.com

Wie funktionieren Filter und Haken wirklich? PHP

Wie funktionieren Filter und Hooks in WordPress?

Ich frage nach etwas Fortgeschrittenem. Wie ist es in PHP implementiert? ZB wie sammelt es alle Hooks aus den verschiedenen Plugins und "hängt" sie an die Core Hooks usw.

21
Aaron Lee

Überblick

Grundsätzlich besteht das " Plugin API ", das Filter und Hooks aufruft, aus den folgenden Funktionen:

  1. apply_filters() - execute
  2. do_action - execute
  3. apply_filters_ref_array() - execute
  4. do_action_ref_array() - execute
  5. add_filter() - zum Stack hinzufügen
  6. add_action() - zum Stack hinzufügen

Grundlegende Interna

Insgesamt gibt es ein paar Globals (was sonst noch in WordPress Welt) beteiligt:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Der erste $wp_filter ist eine globale Array, die alle Filternamen als Subarrays enthält. Jedes dieser Subarrays enthält dann noch mehr Subarrays, die Rückrufe sind, die unter einem Prioritätsarray aufgerufen wurden.

Kurze eingehende

Wenn also eine execute -Funktion aufgerufen wird, durchsucht WordPress diese globalen Arrays nach den Schlüsseln mit diesem Namen. Dann werden die angehängten Callbacks Priorität für Priorität ausgeführt. Das einzige, was im Vorfeld passiert, sind Rückrufe, die an den Filter all angehängt sind.

Wenn Sie einen Rückruf mit add_action oder add_filter hinzufügen, berechnet WordPress zuerst eine "eindeutige" ID, um bereits angehängte Rückrufe nicht zu überschreiben.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Dann wird Ihr Rückruf zum global $wp_filter-Stack hinzugefügt:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Wie Sie sehen, ist das Haupt-Sub-Array der $tag (oder der Aktions-/Filtername), dann wird alles unter einer bestimmten Priorität aufgerufen und dann wird die "eindeutige" Rückruf-/ID-Zeichenfolge als Schlüssel verwendet.

Wenn später ein Filter aufgerufen wird - was mit dem $tag/action-/filter-name geschieht - wird das Array durchsucht und die Rückrufe werden aufgerufen. Da call_user_func_array verwendet wird, spielt es keine Rolle, wie viele Argumente angehängt sind. WordPress löst das von selbst.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
33
kaiser

Hooks sind sowohl in den WordPress-Kerndateien als auch in einigen übergeordneten Themendateien enthalten. Mit ihnen können Sie Inhalte an einer bestimmten Stelle in der Datei einbinden.

Ein Beispiel ist der wp_head-Hook in WordPress. Sie können diesen Haken in Ihrem untergeordneten Design verwenden, um Inhalte an diesem Ort hinzuzufügen. '

Beispiel:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Einige Premium-Themen enthalten auch Aktions-Hooks , die Sie in einem untergeordneten Thema verwenden können, um dasselbe zu tun. Hier ist eine visuelle Karte , die alle Aktions-Hooks und die Position enthält, an der sie Ihre Inhalte im Genesis-Themen-Framework ausgeben.

Beispiel:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

So sieht der Hook aus, wenn Sie die Datei header.php im Genesis-Theme-Framework geöffnet haben:

do_action( 'genesis_header' );

Hier ist eine Liste von WordPress-Hooks , die Sie auf viele Arten verwenden können.

Filter ermöglicht es Ihnen, die Ausgabe einer vorhandenen Funktion zu ändern und ist sowohl in den WordPress-Kerndateien als auch in einigen übergeordneten Themen-Frameworks wie Genesis enthalten.

Hier ist eine Liste der Filter , die Sie mit dem Genesis Design Framework verwenden können

Hier ist eine Liste der in WordPress enthaltenen Filter

Hier ist ein Beispiel, wie Sie einen Filter in einem Themenframework wie Genesis verwenden können:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Der obige Code kann in einem untergeordneten Design verwendet werden, um den vom Autor angegebenen Text in Ihren Kommentaren zu ändern. Es funktioniert in jedem Thema.

Hier ist ein weiteres Beispiel, das die Länge der Auszüge auf 50 Wörter anpasst:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Sie finden die Funktion the_excerpt () in der Datei wp-includes/post-template.php.

So sieht es aus:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Sie können auch Hooks und Filter in Plugins verwenden, um genau dasselbe zu tun, und der Code geht nicht verloren, wenn Sie das übergeordnete Design oder WordPress aktualisieren.

Grundsätzlich können Sie mit Hooks und Filtern sowohl WordPress als auch Ihr übergeordnetes Thema anpassen und ändern, ohne die zentralen WordPress-Dateien oder Ihre übergeordneten Themendateien zu bearbeiten.

Das Anpassen eines untergeordneten Designs ist erheblich einfacher, wenn das übergeordnete Design-Framework Hooks und Filter enthält, da Sie die Vorlagendateien für übergeordnete Designs nie bearbeiten müssen. Auf diese Weise können Sie auch Themen sicher ändern.

5
Brad Dalton