Reel 'em In Hooks von innen nach außen verstehen

Der Schlüssel für die flexible Basis von WordPress liegt in der Verwendung von Haken. Sei es in Themes, Plugins oder im Kern: Hooks ermöglichen ein beispielloses Wachstum und stellen gleichzeitig die Kompatibilität mit zukünftigen Versionen von WordPress sicher. Daher sollte das Verständnis für sie zweifellos Teil des Repertoires eines Entwicklers sein. Machen Sie mit und entdecken Sie die Feinheiten dieses einfachen, aber raffinierten Systems von innen heraus.

Als Roadmap für diesen Artikel gehen wir auf das Konzept hinter Hooks, deren Implementierung und natürlich auf Beispiele ein.


Konzept: Was und Warum?

"Einfach gesagt, ein Haken ist ein Platzhalter für eine Aktion."

Hinter jeder gut geschriebenen Software steht ein solides Konzept, das die Fragen nach dem Warum und Warum beantwortet. Haken sind keine Ausnahme. Einfach ausgedrückt ist ein Haken ein Platzhalter für eine Aktion. Wenn ein bedeutendes Ereignis auftritt, beispielsweise die Veröffentlichung eines Beitrags, wird ein Hook aktiviert, sodass relevante Reaktionen stattfinden können. In Bezug auf Entwickler kann man sich Hooks als Implementierung eines ereignisgesteuerten Systems vorstellen.

Mehr als nur eine Definition erfordert ein Konzept eine Begründung, die erklärt, warum es nützlich ist. Hooks spielen eine wichtige Rolle in WordPress, da sich das Projekt ständig weiterentwickelt. Mit Hunderten von Entwicklern, die das System ständig aktualisieren, ist es nicht möglich, die Kerndateien für jedes Plugin, jedes Design oder spezielle Anpassungen zu bearbeiten, da sich diese häufig ändern. Stattdessen ist ein Framework erforderlich, um das System zu erweitern, damit externe Funktionen genauso wirksam sein können wie interne Manipulationen. Haken sind der Schlüssel zu diesem Rahmen.


Umsetzung: Wie?

Als Entwickler wird die Rolle des Entwicklers erweitert, um nicht nur zu verstehen, was etwas tut oder warum es getan wird, sondern auch um zu verstehen, wie es erstellt wird. Mit anderen Worten, um das System von Hooks vollständig zu verstehen, muss man verstehen, wie sie implementiert werden.

Wie bei einem Multiple-Choice-Test ist der direkte Blick auf die Antworten jedoch nicht unbedingt die beste Idee. Wie viele Test-Test-Strategien nahelegen, ist es oft besser, die Frage zu lesen, Ihre eigenen Gedanken zu der Antwort zu formulieren und dann die Wahl zu treffen, die Ihrer Argumentation am nächsten kommt. Eine ähnliche Methode kann angewendet werden, wenn Sie Softwareentwicklungsimplementierungen verstehen. Anstatt sich den Code einer anderen Person anzusehen, um zu verstehen, wie ein Feature realisiert wird, ist es oft sogar noch sinnvoller, es zuerst selbst zu implementieren und anschließend zu untersuchen, wie es tatsächlich durchgeführt wird. Genau das machen wir.

Anstatt sich den Code einer anderen Person anzusehen, um zu verstehen, wie ein Feature realisiert wird, ist es oft sogar noch sinnvoller, es zuerst selbst zu implementieren und anschließend zu untersuchen, wie es tatsächlich ausgeführt wird.

Schlussfolgerung aus der Dokumentation

Um einen Einblick in die Implementierung eines Systems zu erhalten, ist die Dokumentation häufig ein nützlicher Einstieg. Sehen wir uns die Zusammenfassungen der beiden Kernfunktionen von WordPress gemäß dem Codex an:

  • add_action ($ hook, $ function [, $ Priorität [, $ numArgs]]) - Gibt einen Funktionshandler an, $ Funktion, einmal einen bestimmten Haken genannt werden, $ hook, wird aufgrund eines Ereignisses aktiviert. $ Priorität legt fest, ob dieser Funktionshandler vor oder nach anderen Funktionshandlern aufgerufen wird, und legt den Standardwert 10 fest. Niedrigere Prioritäten führen dazu, dass eine Funktion früher aufgerufen wird und umgekehrt. $ numArgs ist die Anzahl der Argumente, die der Funktionshandler annehmen wird, und ist standardmäßig auf 1 gesetzt.
  • do_action ($ hook [, $ arg1 [, $ arg2 [, $ arg3 [,?]]])) - Aktiviert einen bestimmten Haken, $ hook, durch Aufrufen aller Handhabungsfunktionen mit den optionalen Argumenten $ arg1, $ arg2, $ arg3, usw.

Mit der vorliegenden Dokumentation ist es Zeit, Rückschlüsse auf diese beiden Funktionen zu ziehen. add_action Es muss lediglich eine Funktion, Priorität und Anzahl der Argumente mit einer Zeichenfolge verknüpft werden. Dies scheint der perfekte Job für ein PHP-Array zu sein, das als Hash-Map fungiert, die Schlüssel-Wert-Paare speichert. do_action Noch trivialer ist es, einen einfachen Blick in das gleiche Array zu werfen, um die entsprechenden Funktionshandler zu finden und sie anschließend aufzurufen. Angesichts unserer Erkenntnisse ist es an der Zeit, unsere Implementierung fortzusetzen.

Unser Wissen anwenden

Da wir dies tun, um Einblick in das WordPress-Hook-System zu erhalten, müssen diese beiden Funktionen nicht wörtlich aus der Dokumentation implementiert werden. Konzentrieren wir uns stattdessen auf ihre Implementierungen, ohne die optionalen Argumente, um Zeit zu sparen und trotzdem den Kernpunkt zu gewinnen.

Bevor wir beginnen, legen wir einen Umriss fest:

  • Wir benötigen ein globales Array, auf das beide Funktionen zugreifen können.
  • add_action speichert den angegebenen Hook-Namen und eine Gruppe entsprechender Funktionshandler als Schlüsselwertpaar im Array.
  • do_action ruft die entsprechenden Funktionshandler für einen bestimmten Hook-Namen ab und ruft jeden auf.

Daraus ergibt sich folgender Code:

$ actions = array (); function add_action ($ hook, $ function) globale $ -Aktionen; // ein Array mit Funktionshandlern erstellen, wenn es noch nicht existiert if (! isset ($ actions [$ hook])) $ actions [$ hook] = array (); // die aktuelle Funktion an die Liste der Funktionshandler anhängen $ actions [$ hook] [] = $ function;  function do_action ($ hook) globale $ actions; if (isset ($ actions [$ hook])) // jeden mit diesem Hook verknüpften Funktionshandler foreach ($ actions [$ hook] als $ function) aufrufen call_user_func ($ function); 

Das ist nicht schlecht; Wir haben ein vielseitiges Hakensystem in rund 20 Zeilen Code implementiert. Nun, da wir uns eine Vorstellung davon gemacht haben, wie Hooks funktionieren, wollen wir uns mit dem Kerncode von WordPress beschäftigen, um unsere Hypothese zu bestätigen.

Ein Werkzeug, um schnell durch diesen Code zu navigieren, ist Yoast's PHP Cross Reference von WordPress Source. Auf der Suche nach add_action ergibt den folgenden Code:

function add_action ($ tag, $ function_to_add, $ Priorität = 10, $ akzeptierte_args = 1) return add_filter ($ tag, $ function_to_add, $ Priorität, $ akzeptierte_args);  function add_filter ($ tag, $ function_to_add, $ priority = 10, $ akzeptierte_args = 1) globaler $ wp_filter, $ merged_filters; $ idx = _wp_filter_build_unique_id ($ tag, $ function_to_add, $ priority); $ wp_filter [$ tag] [$ priority] [$ idx] = Array ('function' => $ function_to_add, 'akzeptierte_args' => $ akzeptierte_args); unset ($ merged_filters [$ tag]); wahr zurückgeben; 

add_action Anrufe add_filter was nicht überraschend die angegebene Funktion zu einem Array hinzufügt, das durch den Hook-Namen gekennzeichnet ist, $ tag. Obwohl es etwas mehr ist wegen der $ Priorität und $ accept_args Diese Funktion stimmt im Wesentlichen mit unserer eigenen überein und bestätigt unseren Verdacht. do_action, Wenn auch etwas länger und ein bisschen komplexer, läuft es auf den folgenden Code hinaus:

function do_action ($ tag, $ arg = ") [Ausgelassener Code, der Statistiken aufzeichnet, Argumente verarbeitet und mit Filtern arbeitet] do foreach ((array) current ($ wp_filter [$ tag]) als $ the_) if (! is_null ($ the _ ['function'])) call_user_func_array ($ the _ ['function']), array_slice ($ args, 0, (int) $ the _ ['akzeptierte_args'])); next ($ wp_filter [$ tag])! == false); [Ausgelassener Code, der aufräumt]

Das Durchlaufen der zugehörigen Funktionen und das Aufrufen der einzelnen Funktionen ist uns allen nicht fremd. Tatsächlich ist es genau das, was wir in unserer Implementierung vermuteten. Wenn wir also mit unseren eigenen Gedanken über den Code beginnen, hat dies nicht nur zu einem besseren Verständnis geführt, sondern erforderte auch ein kritisches Denken und die Problemlösung, die für die Softwareentwicklung unerlässlich sind.


Beispiele

Wenn wir wissen, was, warum und wie gut in der Hand ist, ist es Zeit, mit zwei Beispielen fortzufahren. Der erste ist ein Spiel auf RSS; Anstatt Benachrichtigungen über Syndication bereitzustellen, verwenden Sie stattdessen E-Mails?

E-Mail-Benachrichtigungssystem

Um unser System zu implementieren, müssen wir suchen, wann ein Post veröffentlicht wird. Aber welchen Haken sollten wir benutzen? Die API-Aktionsreferenz enthält eine Liste von Hooks sowie Beschreibungen der zugehörigen Ereignisse, mit deren Hilfe wir genau dies feststellen können. In der Tat die publish_post Hooks Beschreibung stimmt mit dem überein, was wir brauchen, also fügen wir einen Funktionshandler hinzu:

add_action ('publish_post', 'notify_via_email');

Jetzt müssen Sie nur noch eine E-Mail-Benachrichtigung an jemanden in der notify_via_email Funktionshandler. Beachten Sie, dass die API-Aktionsreferenz angibt, dass die publish_post hook übergibt die Post-ID als Argument an unsere Handling-Funktion. Dies ermöglicht uns Informationen über die Post über die get_post Funktion wie folgt:

Funktion notify_via_email ($ post_id) $ post = get_post ($ post_id); $ to = '[email protected]'; $ subject = 'Post Published on'. get_bloginfo ('name'); $ message = $ post-> post_title. wurde am veröffentlicht. get_bloginfo ('name'). 'ab'. $ post-> post_date. '. Sie können es bei 'ansehen. get_permalink ($ post_id). '.'; wp_mail ($ to, $ subject, $ message); 

Nach dem Abrufen der Post verwenden wir den Titel, das Datum und den Permalink in unserer E-Mail-Nachricht. Es wird dann über die gesendet wp_mail Funktion, die einen Empfänger, einen Betreff und eine Nachricht als Parameter erfordert. Damit ist unser einfaches E-Mail-Benachrichtigungssystem komplett. Beachten Sie, dass ein Anruf nicht empfohlen wird wp_mail mehrmals auf einmal, da nach dem Drücken des Publish-Post-Buttons eine erhebliche Verzögerung in der Ladezeit der Seite angezeigt wird.

Google Analytics-Plugin

Zunächst scheint es, als sei ein Thema für diesen Code besser geeignet. Im Gegenteil, durch, da das Thema einer Site anfällig für Überarbeitung und Änderung ist. Infolgedessen kann der Analysecode beim Übergang von einem Thema zum nächsten leicht verloren gehen.

Unsere erste Anwendung war, wenn auch ein wenig kompliziert, eine schnelle Einführung in die Verwendung von Haken. Dieses zweite Beispiel wird sich jedoch viel mehr für die Verwendung in der realen Welt eignen. Wir erstellen ein einfaches Google Analytics-Plugin, das automatisch Tracking-Code in die Fußzeile einer Seite einfügt.

Zunächst scheint es, als sei ein Thema für diesen Code besser geeignet. Im Gegenteil, durch, da das Thema einer Site anfällig für Überarbeitung und Änderung ist. Infolgedessen kann der Analysecode beim Übergang von einem Thema zum nächsten leicht verloren gehen. Das Erstellen eines Plugins umgeht diesen Nachteil. Da er unabhängig davon, welches Thema verwendet wird, aktiv bleibt, ist der Analysecode immer noch vorhanden, sodass keine Themenpflege erforderlich ist.

Aber wie fügen wir Code in die Fußzeile einer Website ein? Auch dies erfolgt über Haken. Wenn Sie bereits mit WordPress-Themes gearbeitet haben, haben Sie wahrscheinlich die wp_head und wp_footer Funktionen im Kopf- und Fußbereich Ihrer Website. Beide Funktionen sind vorhanden, um Hooks einfach zu aktivieren, sodass Plugins leicht Code in diese wichtigen Bereiche der Seite einfügen können. Daher fügen wir einfach eine Aktion hinzu wp_footer Haken:

add_action ('wp_footer', 'add_google_analytics_code');

Unsere add_google_analytics_code Funktion druckt, wie der Name schon sagt, den Google Analytics-Code aus:

  

Denken Sie daran, sich zu ändern UA-XXXXX-X auf Ihre Site-spezifische ID und schon sind Sie fertig! Fügen Sie diesen Code einfach zu einer Datei hinzu und laden Sie ihn in Ihr WordPress-Plugins-Verzeichnis hoch. Stellen Sie sicher, dass Sie einen Plugin-Header einfügen:

Vergessen Sie nicht, den Namen des Autors und die URI des Autors zu ändern und das Plugin natürlich zu aktivieren!


Fazit

Indem wir Hooks in ein Konzept, eine Implementierung und Beispiele aufteilen, haben wir sie effektiv innerhalb des WordPress-Kerns nach außen in einer realen Anwendung untersucht. Anstatt nur den WordPress-Kerncode zu betrachten, haben wir unsere eigene Version von Hooks durch Inferenz implementiert, um ein tieferes, entwicklerähnliches Verständnis dieses leistungsstarken Systems zu erhalten. Schließlich haben wir mit einer praktischen Google Analytics Plugin-Anwendung vorläufige Erkenntnisse darüber erhalten, wie nützlich Hooks wirklich sein können. Seien Sie sicher, dass Sie beim nächsten Mal dabei sind, und teilen Sie Ihre eigene, innovative Verwendung von Haken in den Kommentaren unten mit!