Probleme beim Verstehen von apply_filters ()

19

In apply_filters ()

apply_filters( $tag, $value, $var ... );

Ich habe Probleme, meinen Kopf um das $valueund zu wickeln $var. Ich habe den Kodex gelesen und es hört sich so an, $valueals könnte er geändert werden $var, aber ich habe keine Beispiele dafür in freier Wildbahn gefunden. Es scheint als eine Möglichkeit verwendet zu werden, eine Variable zu übergeben. In welchem ​​Fall ist der Unterschied zwischen dem und dem $var?

r00tAcc3ss
quelle

Antworten:

35

Versuchen Sie, die Funktion mit besseren Namen zu sehen:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

Also, wenn diese Funktion aufgerufen wird als:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

Sie können verwenden ...

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

... und zwei Variablen an diese Funktion übergeben bekommen. Sie geben die erste zurück, die zweite liefert nur mehr Kontext:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Die zusätzlichen Variablen dienen dazu, Ihre Entscheidungen zu vereinfachen und nicht zu ändern.

fuxia
quelle
Wenn ich richtig verstehe. Ich füge keine Variable hinzu, um den zurückgegebenen Wert von apply_filters zu erfassen, da er automatisch auf $ value_to_change angewendet wird.
r00tAcc3ss
@ r00tAcc3ss Es passiert nichts automatisch. Sie müssen den Wert in Ihrem Rückruf ändern. Sie können es auch unverändert zurückgeben, wenn Sie möchten - je nach Kontext.
Fuxia
Oh ja. Ich wollte damit sagen, dass ich den zurückgegebenen Wert nicht in eine andere Variable übernehmen und $ value zuweisen muss. Das ist erledigt, wenn ich $ value in der Hook-Funktion ändere und "automatisch" zurückgebe.
r00tAcc3ss
11

Was sind Filter?

Filter sind Funktionen, die WordPress zu bestimmten Zeitpunkten der Ausführung durchläuft, bevor eine Aktion mit den Daten ausgeführt wird (z. B. Hinzufügen zur Datenbank oder Senden an den Browser-Bildschirm). Filter befinden sich zwischen der Datenbank und dem Browser (wenn WordPress Seiten generiert) und zwischen dem Browser und der Datenbank (wenn WordPress der Datenbank neue Beiträge und Kommentare hinzufügt). Die meiste Eingabe und Ausgabe in WordPress durchläuft mindestens einen Filter. WordPress filtert standardmäßig etwas, und Ihr Plugin kann seine eigene Filterung hinzufügen.

Einhaken in einen Filter

Damit Benutzer bestimmte Daten (einen Wert, die Ausgabe einer Funktion usw.) ändern können, werden Filter-Hooks über apply_filtersFunktionen bereitgestellt .
Diese Filter-Hooks enthalten den Namen (oder das Tag ) des Filters und mindestens den Funktionsnamen, der zum Filtern (dh zum Ändern auf irgendeine Weise) der Daten verwendet werden soll.

Um den Titel eines Posts zu ändern, können Sie den the_titleFilter-Hook verwenden, der wie folgt definiert ist:

apply_filters( 'the_title', $title, $id );

Das heißt, der Filter hat das Tag / den Namen the_title, der erste Parameter enthält $titledie zu ändernden Daten (dh den Post-Titel) und der zweite Parameter enthält $idzusätzliche Informationen (in diesem Fall die Post-ID).

Um beispielsweise den Titel jedes Posts in GROSSBUCHSTABEN anzuzeigen, können Sie die folgende Zeile verwenden:

add_filter('the_title', 'strtoupper');

Wenn wir uns die add_filterFunktion ansehen , sehen wir, dass sie wie folgt definiert ist:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Wir haben nur den ersten und den zweiten (erforderlichen) Parameter angegeben, während der dritte und der vierte Parameter auf den jeweiligen Standardwert (dh 10und 1) gesetzt sind.

Ein komplexerer Filter

Wenn Sie nur einen bestimmten Beitrag filtern möchten , können Sie die zusätzlichen Informationen verwenden (im Falle dieses Filters: die ID). Dazu müssen Sie die Anzahl der Parameter angeben (in diesem Fall 2), und um dies erneut zu tun, müssen Sie den Prioritätsparameter angeben (der vor der Anzahl der Argumente steht).

Angenommen, wir möchten nur den Titel des Beitrags mit der ID 42 beeinflussen, dann sieht es so aus:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

In diesem Fall müssen alle vier verfügbaren Parameter angegeben werden.

Welche Parameter habe ich?

Um die (Anzahl) verfügbaren Parameter eines bestimmten Filters zu identifizieren, müssen Sie nachsehen, wo dieser definiert ist (in diesem Fall: hier ).


Referenzen :

tfrommen
quelle
2
+1 für eine gründliche Antwort und einwandfreie Klasse (schöne Formatierung brochacho)!
Bosco
Danke, das ist sehr gründlich, erklärt aber nicht wirklich, was ich gefragt habe. z.B. die Differenz zwischen der Variablen $ value und $ var im Filter.
r00tAcc3ss
Hm, würde ich sagen, das tut es, aber das ist natürlich mein subjektives Gefühl. Ich werde jedoch einige Informationen zum Filter und seinen Parametern hinzufügen.
Beginn am