it-swarm.com.de

Woher weiß ich, welche Variablen in einem Filter/einer Aktion übergeben werden und welche Bedeutung sie haben?

Was ich jetzt schon mehrmals gesehen habe und nicht verstehe, ist das Folgende: Im functions.php eines Themas wird eine Funktion definiert und dann wie folgt an einen Hook angehängt (vereinfachtes Beispiel):

function do_stuff($a, $b) {
    // Do stuff with $a and $b
}
add_filter( 'bloginfo_url', 'do_stuff', 10, 2 );

Grundsätzlich denke ich, dass ich verstehe, was dort passiert, aber woher weiß ich, was $aund $bist?
Auf eine "traditionelle" PHP Weise würde man die Funktion vielleicht so aufrufen:

do_stuff("var a content", $var_b_content);

Dann ist klar, was $a und $b enthalten, aber woher kann ich das mit Wordpress wissen?

Nehmen Sie zum Beispiel die folgende Funktion (Dank an Frank Bültge ):

if ( ! function_exists( 'fb_css_cache_buster' ) ) {
        function fb_css_cache_buster( $info, $show ) {
                if ( ! isset($pieces[1]) )
                        $pieces[1] = '';
                if ( 'stylesheet_url' == $show ) {

                        // Is there already a querystring? If so, add to the end of that.
                        if ( strpos($pieces[1], '?' ) === FALSE ) {
                                return $info . "?" . filemtime( WP_CONTENT_DIR . $pieces[1] );
                        } else {
                                $morsels = explode( "?", $pieces[1] );
                                return $info . "&" . filemtime( WP_CONTENT_DIR . $morsles[1] );
                        }
                } else {
                        return $info;
                }
        }

        add_filter( 'bloginfo_url', 'fb_css_cache_buster', 9999, 2 );
}

Die Funktion kann für die CSS-Versionierung verwendet werden, indem das Datum der letzten Änderung (mit filemtime) als Abfragezeichenfolge an den CSS-Aufruf angehängt wird.

Sie können sehen, dass $info und $show als Variablen verwendet werden, die an diese Funktion übergeben werden. Aber wie kann ich wissen, was diese Variablen enthalten? Er benutzt diese Variablen sogar in der bedingten Logik ('stylesheet_url' == $show), also muss da irgendwie etwas automatisch übergeben werden?

2
Sven

Grundsätzlich muss jeder Filter im ursprünglichen Funktionscode registriert sein (da ein Filter nur eine Möglichkeit ist, das Geschehen in der Standardfunktion zu überschreiben). Bevor Sie also Ihre benutzerdefinierte Funktion mit add_filter() an einen Filter anhängen können, muss der Filter zuvor mit apply_filters() registriert werden (es gibt andere Funktionen, die dasselbe tun - dies ist jedoch die wichtigste).

In dem Beispiel, das Sie in der ursprünglichen Funktion angegeben haben, wird also apply_filters() aufgerufen (Zeile 533):

$output = apply_filters('bloginfo_url', $output, $show);

Wie Sie sehen, sind die beiden Parameter im ursprünglichen Funktionskontext $output und $show.

Zusammenfassend lässt sich sagen, dass die Parameter eines Filters am besten folgendermaßen ermittelt werden:

  • Schlagen Sie die Dokumentation der Parameter im Codex nach (obwohl dort nicht alle Filter vollständig dokumentiert sind).
  • Sehen Sie sich den Quellcode der ursprünglichen Funktion an, um festzustellen, welche Parameter an den Filter übergeben werden.

Bearbeiten, um Ihren Kommentar zu beantworten

Weil $ info nur ein anderer Name für $ output ist?

Du hast recht. Die Namen der Variablen können sich ändern, wenn sie durch einen Filter geleitet werden. Dies liegt einfach daran, wie das Deklarieren einer Funktion in PHP funktioniert:

my_function($output);

function my_function($info) {
    // in the context of this function the content of $output is now inside the variable $info.
}

Was genau passiert im Filter 'bloginfo_url'? Ich habe versucht, es im Kern zu finden, aber es ist nicht da.

Standardmäßig passiert mit bloginfo_url nichts. WordPress Core fügt diesem Filter keine Funktionen hinzu. Es stellt nur diesen Filter für Sie bereit, sodass Sie das native WordPress-Verhalten ändern können, ohne eine der Kerndateien ändern zu müssen. (Dies ist nur für diesen Filter der Fall, einige der anderen Filter werden von WordPress selbst verwendet.)

Eine Sache, die Sie bei der Arbeit mit diesen Filtern immer beachten müssen, ist, dass andere (Plugins oder WordPress selbst) Funktionen anfügen können, die mit den Dingen in Konflikt stehen, die Sie mit Ihrer Funktion erreichen möchten. Mit dem Parameter $priority können Sie steuern, wann Ihre Funktion in Bezug auf die anderen Funktionen ausgeführt wird, die demselben Filter zugeordnet sind.

5
s1lv3r