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.
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.
Antworten:
Grundsätzlich besteht die " Plugin API ", die Filter und Hooks aufruft, aus folgenden Funktionen:
apply_filters()
- ausführendo_action
- ausführenapply_filters_ref_array()
- ausführendo_action_ref_array()
- ausführenadd_filter()
- Zum Stapel hinzufügenadd_action()
- Zum Stapel hinzufügenInsgesamt 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_filter
ist 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.
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 all
Filter angehängt sind .
Wenn Sie einen Rückruf mit add_action
oder 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_filter
Stapel 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_array
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']
)
);
}
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.