Wie funktionieren Filter und Hooks wirklich in PHP?


21

Wie funktionieren Filter und Hooks in WordPress?

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


2
Soweit ich weiß, gibt es in PHP keine 'Hooks' oder 'Filter', sondern Funktionen. Wordpress verfügt über spezielle Funktionen, die vor ihrer Ausführung einen Rückruf anderer Funktionen verwenden.
Ofir Baruch


3
@OfirBaruch, ich bin mir ziemlich sicher, dass sich das OP auf ihre Implementierung in WordPress bezog und nicht darauf hinwies, dass es eine native PHP-Implementierung davon gab.
Tom Auger

Antworten:


33

Überblick

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

  1. apply_filters()- ausführen
  2. do_action- ausführen
  3. apply_filters_ref_array()- ausführen
  4. do_action_ref_array()- ausführen
  5. add_filter()- Zum Stapel hinzufügen
  6. add_action()- Zum Stapel 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;

Das erste $wp_filterist ein Global Array, das 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 eine Ausführungsfunktion 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 allFilter angehängt sind .

Wenn Sie einen Rückruf mit add_actionoder hinzufügen add_filter, berechnet WordPress zunächst 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_filterStapel 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.

Später, wenn ein Filter aufgerufen wird - was mit dem $tag/ action- / filter-Namen geschieht - wird das Array durchsucht und die Rückrufe werden aufgerufen. Da es verwendet wird, spielt call_user_func_arrayes 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']
        )
    );
}

3
Vergessen Sie nicht, dass beim Durchlaufen der Rückrufe die Ausführung mehrerer Rückrufe am selben Hook anhand ihrer "Priorität" angeordnet wird, die (optional) mit add_action () und apply_filters () festgelegt und standardmäßig auf 10 gesetzt wird.
Tom Auger

1
@TomAuger Sie können der Antwort jederzeit weitere Notizen und Änderungen hinzufügen.
Kaiser

5

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 Speicherort 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, mit denen Sie in einem untergeordneten Thema dasselbe tun können. 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.

Mit Filtern können Sie die Ausgabe einer vorhandenen Funktion ändern. Sie sind 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 Thema oder WordPress aktualisieren.

Grundsätzlich können Sie mit Hooks und Filtern sowohl WordPress als auch Ihr übergeordnetes Thema anpassen und ändern, ohne die WordPress-Kerndateien 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.


2
Dies ist ein großartiger allgemeiner Überblick über Hooks und Filter, aber ich fürchte, ich verpasse die Frage des OP, die sich mit den Interna befasst, wie Hooks funktionieren und wie WordPress sie erstellt, speichert und verarbeitet. Gute Antwort; Sie sollten wahrscheinlich auf Ihr Tutorial auf WP Sites verlinken.
Tom Auger

Ok, ich werde es löschen. Ich hätte die Frage besser lesen sollen, dachte aber, die bereits gegebenen Antworten wären für Anfänger leichter zu verstehen, wenn sie die Grundlagen zuerst kennen würden.
Brad Dalton

2
Brad, ich habe es wiederhergestellt, da ich denke, dass es nützlich sein könnte, diese Informationen auch hier zu haben. Wenn Sie nicht einverstanden sind, erwähnen Sie mich einfach hier und ich werde es wieder entfernen.
Kaiser
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.