Verwaltbare WordPress-Widgets schreiben Teil 2 von 2

Im ersten Beitrag dieser Serie haben wir die Gründe diskutiert, weshalb WordPress-Plugins eher wie größere Softwareprojekte behandelt werden sollten (was aber häufig nicht der Fall ist). Es wurde dargelegt, dass mit gut organisiertem Code versucht wird, unsere Plugin-Projekte wartungsfreundlicher zu machen . All dies wurde im Rahmen der Entwicklung eines WordPress-Widgets durchgeführt.


Die Widgets sind jedoch nicht die einzigen Plugins, die für WordPress entwickelt werden können. Die Anwendung unterstützt auch Plugins, die ihre Funktionalität durch die Verwendung von Hooks erweitern, die sich in der gesamten Anwendung befinden. Daher sind Widgets nicht die einzige Art von Plugins, die von einer Boilerplate profitieren könnten.

In diesem Tutorial definieren wir, was genau WordPress-Hooks sind, wie sie funktionieren und warum sie von Vorteil sind. Als Nächstes werfen wir einen Blick auf meine WordPress Widget Boilerplate und wie Sie sie in neuen Projekten über den Kontext einer Beispielanwendung nutzen können.


Grundlegendes zu Hooks, Aktionen und Filtern

Bevor Sie Plugins entwickeln, ist es wichtig, das WordPress-Modell für das Einhängen in die Anwendung und die Unterschiede zwischen Aktionen und Filtern zu verstehen.

  • Hooks sind Bereiche in der Kernanwendung von WordPress, in denen Sie Ihren Code zur Ausführung registrieren können. Einfach gesagt, Ihr Plugin registriert sich bei WordPress zu einem bestimmten Zeitpunkt der Ausführung. Wenn WordPress diesen Punkt der Ausführung erreicht (entweder beim Speichern von Informationen, beim Rendern von Informationen oder an einem anderen Punkt), wird der Code ausgelöst.
  • Aktionen sind eine Art von Hooks, die WordPress zur Verfügung stellt, damit Sie immer dann profitieren können, wenn ein bestimmtes Ereignis während des Lebenszyklus der Anwendung auftritt. Einige dieser Punkte umfassen das Aktivieren eines Designs, das Speichern eines Beitrags oder das Rendern von Stylesheets. Wenn Sie zu einem beliebigen Zeitpunkt im WordPress-Lebenszyklus bestimmte benutzerdefinierte Funktionen einfügen möchten, steht im Allgemeinen ein Aktions-Hook zur Verfügung.
  • Filter sind eine Art Hook, den WordPress zur Verfügung stellt, um Daten zu bearbeiten, bevor sie an die Datenbank gesendet werden oder zum Rendern im Browser gesendet werden. Einfach ausgedrückt: WordPress übergibt den Inhalt an Ihre Funktion und fährt dann mit dem Vorgang fort, den Sie zurückgeben. Wenn Sie Daten bearbeiten möchten, bevor Sie sie speichern oder anzeigen, ist die beste Option die Verwendung von Filtern.

Einfach genug, richtig? Darüber hinaus bietet WordPress eine umfassende Dokumentation zum Hinzufügen von Aktionen [1] und Hinzufügen von Filtern [2]. Sie können viel mehr über Plugins in der Plugin-API [3] im WordPress-Codex [4] erreichen..


Eine Plugin Boilerplate

Wenn Sie den vorherigen Artikel gelesen haben, sind Sie mit der Widget-API bereits vertraut. Es ist präzise, ​​dass es einen Konstruktor und nicht weniger als drei Funktionen erfordert, damit etwas funktioniert. Da Plugins die Flexibilität haben, an verschiedenen Punkten im WordPress-Prozess zu hängen, ist die Plugin-API etwas weniger strukturiert. Glücklicherweise bedeutet dies nicht, dass wir keine Boilerplate erstellen können, aus denen unsere Plugins erstellt werden.

Immerhin bestehen sie immer noch aus einigen allgemeinen Funktionen:

  • Core-Plugin-Code
  • Stylesheets
  • JavaScript
  • Lokalisierungsdateien
  • Markup
  • Bilder

Ähnlich wie bei unserem WordPress Widget Boilerplate können wir unser Vorlagenverzeichnis so einrichten, dass es wie folgt aussieht:

Sieht vertraut aus, nicht wahr? Der wichtigste Aspekt der Plugin-Boilerplate sind nicht die Details der Verzeichnisstruktur (wir werden uns in Zukunft noch etwas genauer anschauen), sondern die Organisation des Kern-Plugin-Codes selbst.

Das Plugin-Skelett

Plugins können entweder mit einer Handvoll Funktionen oder durch das Einschließen jeder Funktion in eine Klasse in einem objektorientierten Ansatz entwickelt werden. Ich bin ein Fan von Letzterem und meine Heizplatte repräsentiert das. Hier ist die Plugin-Definition:

 init_plugin_constants (); load_plugin_textdomain (PLUGIN_LOCALE, false, dirname (plugin_basename (__ FILE__)). '/ lang'); / * * TODO: * Definiere die benutzerdefinierte Funktionalität für dein Plugin. Der erste Parameter der Aufrufe * add_action / add_filter sind die Hooks, in die Ihr Code ausgelöst werden soll. * * Der zweite Parameter ist der Funktionsname innerhalb dieser Klasse. Siehe die Stubs * später in der Datei. * * Weitere Informationen: * http://codex.wordpress.org/Plugin_API#Hooks.2C_Actions_and_Filters * / add_action ('TODO', array ($ this, 'action_method_name')); add_filter ('TODO', array ($ this, 'filter_method_name'));  // Ende wenn // Endkonstruktor / * -------------------------------------- ------* * Kernfunktionen *--------------------------------------- ------ * / / ** * Hinweis: Aktionen sind Punkte bei der Ausführung eines Seiten- oder Prozesslebenszyklus, die von WordPress ausgelöst werden. * / function action_method_name () // TODO definiert hier Ihre Action-Methode // Ende action_method_name / ** * Hinweis: Filter sind Ausführungspunkte, an denen WordPress die Daten * ändert, bevor sie gespeichert oder an den Browser gesendet werden. * / function filter_method_name () // TODO definiert hier Ihre Filtermethode // end filter_method_name / * ---------------------------- ---------------- * * Private Funktionen * ----------------------------- ---------------- * / / ** * Initialisiert Konstanten, die im Plugin * verwendet werden. * / private Funktion init_plugin_constants () / * TODO * * Dies ist die eindeutige Kennung für Ihr Plugin, die beim * Lokalisieren der überall verwendeten Zeichenfolgen verwendet wird. * * Zum Beispiel: WordPress-Widget-Boilerplate-Locale. * / if (! defined ('PLUGIN_LOCALE')) define ('PLUGIN_LOCALE', 'plugin-name-locale');  // end if / * TODO * * Definiere dies als den Namen deines Plugins. Das zeigt * im Widgets-Bereich von WordPress. * * Zum Beispiel: WordPress Widget Boilerplate. * / if (! defined ('PLUGIN_NAME')) define ('PLUGIN_NAME', 'Plugin Name');  // end if / * TODO * * Dies ist der Slug Ihres Plugins, der beim Initialisieren mit * der WordPress-API verwendet wird. * Dies sollte auch das * Verzeichnis sein, in dem sich Ihr Plugin befindet. Verwenden Sie Bindestriche. * * Zum Beispiel: wordpress-widget-boilerplate * / if (! Defined ('PLUGIN_SLUG')) define ('PLUGIN_SLUG', 'plugin-name-slug');  // end if // end init_plugin_constants / ** * Hilfsfunktion zum Registrieren und Laden von Skripten und Stilen. * * @name Die bei WordPress zu registrierende ID * @Dateipfad Der Pfad zur aktuellen Datei * @is_script Optionales Argument, wenn der eingehende Dateipfad eine JavaScript-Quelldatei ist. * / private Funktion load_file ($ name, $ file_path, $ is_script = false) $ url = WP_PLUGIN_URL. $ file_path; $ file = WP_PLUGIN_DIR. $ file_path; if (file_exists ($ file)) if ($ is_script) wp_register_script ($ name, $ url); wp_enqueue_script ($ name);  else wp_register_style ($ name, $ url); wp_enqueue_style ($ name);  // end if // end if // end _load_file // end class // TODO: Aktualisieren Sie den Instantiierungsaufruf Ihres Plugins auf den in der Klassendefinition angegebenen Namen. new TODO (); ?>

Die meisten IDEs verfügen über eine Funktion, die alle ausstehenden TODOs auflistet. Daher platziere ich sie im gesamten Code, um leicht herauszufinden, was während der Entwicklung zu tun ist. Beachten Sie, dass es drei Hauptbereiche des Codes gibt:

  1. Konstrukteur. Diese Funktion definiert alle im Code verwendeten Konstanten, legt alle Lokalisierungsdateien fest und registriert alle Aktionen und Filter in WordPress.
  2. Kernfunktionen sind die im Konstruktor registrierten Funktionsdefinitionen, die während der Ausführung von WordPress ausgelöst werden.
  3. Hilfsfunktionen beziehen sich auf Funktionen, die ich bei der Ausführung verwende, indem sie allgemeine Funktionen abstrahieren (z. B. das Registrieren von JavaScripts und Stylesheets)..

Beachten Sie hierbei, dass die Plugin-Entwicklung von der Widget-Entwicklung abweicht, da nicht mehrere Funktionen erwartet werden. Sie benötigen eigentlich nur einen Konstruktor. Von dort aus alle Funktionen, die in den Aufrufen add_action oder add_filter definiert sind, und Ihre Verantwortung für die Implementierung.

Sinn ergeben? Schauen wir uns die Verwendung dieser Heizplatte in einem einfachen Beispiel an.


Ein Arbeitsbeispiel mit dem RSS-Feed Ihres Blogs

WordPress bietet Hooks für fast auszuführende Punkte, die Sie sich vorstellen können. In diesem Beispiel verbinden wir uns mit dem Post-Rendering-Prozess, um eine benutzerdefinierte Nachricht einzuführen. Die Sache ist, wir möchten die besagte Nachricht nur im Kontext eines RSS-Readers anzeigen.

Zunächst die Anforderungen:

  • Zeige eine Nachricht in der Fußzeile jedes Beitrags
  • Die Nachricht sollte nur in RSS-Readern angezeigt werden
  • Die Nachricht sollte einen Link zur Website des Beitrags enthalten

Aus diesem Grund sieht es nicht so aus, als müssten wir JavaScript, CSS oder Markup erstellen, um unser Plugin zu erstellen, damit wir die Plugin-Plugin-Datei auf den Core-Plugin-Code und die Lokalisierungsdateien reduzieren können:

An dieser Stelle können wir die Boilerplate mit einem Namen und den Plugin-Konstanten ausdrücken:

 / ** * Initialisiert Konstanten, die im Plugin * verwendet werden. * / private Funktion init_plugin_constants () if (! defined ('PLUGIN_LOCALE')) define ('PLUGIN_LOCALE', 'rss-note-locale');  // Ende if if (! defined ('PLUGIN_NAME')) define ('PLUGIN_NAME', 'RSS-Hinweis');  // Ende if if (! defined ('PLUGIN_SLUG')) define ('PLUGIN_SLUG', 'rss-note-slug');  // Ende wenn // Ende von init_plugin_constants

Als Nächstes müssen wir uns überlegen, welche Art von Hook für die Bearbeitung des Inhalts erforderlich ist. Erinnern wir uns daran, dass wir versuchen, dem Renderer im Browser etwas hinzuzufügen, benötigen wir einen Filter. Von hier aus können wir den Konstruktor ersetzen:

 / ** * Initialisiert das Plugin durch Festlegen von Lokalisierungs-, Filter- und Verwaltungsfunktionen. * / function __construct () // Definiere constnats, die im Plugin verwendet werden $ this-> init_plugin_constants (); load_plugin_textdomain (PLUGIN_LOCALE, false, dirname (plugin_basename (__ FILE__)). '/ lang'); // füge die Notiz sowohl dem Auszug als auch dem Haupt-Feed hinzu add_filter ('the_content', array ($ this, 'display_rss_note')); add_filter ('the_excerpt_rss', array ($ this, 'display_rss_note'));  // Konstruktor beenden

Beachten Sie, dass die Funktion zwei Filter verwendet - einen für den_content [5] und einen für den_excerpt_rss [6]. Wir tun dies, weil einige Benutzer sich dafür entscheiden, nur einen Auszug ihres Blogs und nicht den gesamten Inhalt zu veröffentlichen, und wir möchten sicherstellen, dass wir beide Fälle erfassen.

Als Nächstes implementieren wir die Funktionsdefinition, die die Nachricht an den Rest des Posts anfügt:

 / ** * Hängt eine kurze Nachricht an die Fußzeile jedes Beitrags, der in einem RSS-Reader * angezeigt wird, und erinnert Benutzer an den Besuch Ihrer Website. * / public function display_rss_note ($ content) if (is_feed ()) $ content. = '
'; $ content. = '

'; $ content. = __ ('Danke fürs Lesen! Informieren Sie sich über den Rest meiner Beiträge unter', PLUGIN_LOCALE). $ content. = ''; $ content. = get_bloginfo ('name'); $ content. = '!'; $ content. = '

'; $ content. = '
'; // Ende wenn return $ content; // end display_rss_note

Beachten Sie hierbei, dass die Funktion einen Parameter akzeptiert, auf den die $ content-Variable verweist. WordPress selbst übergibt diese Daten an die Funktion. Für diese speziellen Filter beschäftigen wir uns mit dem Inhalt eines Blogbeitrags. Was wir also hinzufügen, muss verkettet werden, damit er am Ende des Beitrags hinzugefügt wird.

Diese Nachricht, die wir hinzufügen, sagt einfach "Danke fürs Lesen! Informieren Sie sich über den Rest meiner Posts unter [Blog Name]!" durch Verwendung der Funktion get_bloginfo () [7]? Natürlich können Sie es aktualisieren, um zu lesen, was Sie möchten. Beachten Sie zum Schluss, dass wir dies in eine Bedingung verpackt haben, die die Funktion is_feed () [8] überprüft. Dies ist wichtig, da der Code nur ausgelöst werden soll, wenn der Inhalt über einen RSS-Feed gesendet wird.

Das ist es - nicht so schlimm, oder? Sie können die vollständige Version des Arbeitsquellcodes (einschließlich der zugehörigen README) für dieses Plugin auf GitHub oder direkt hier bei Wptuts herunterladen. Die Boilerplate ist auch auf GitHub verfügbar.

Das Ziel dieser Serie war nicht nur die Einführung einer Einführung in die WordPress Plugin-API, sondern auch die Bereitstellung von Case und Boilerplates, die die Behandlung und Pflege von WordPress Plugins wie jedes andere Softwareprojekt erheblich erleichtern.

  1. http://codex.wordpress.org/Function_Reference/add_action
  2. http://codex.wordpress.org/Function_Reference/add_filter
  3. http://codex.wordpress.org/Plugin_API
  4. http://codex.wordpress.org/Main_Page
  5. http://codex.wordpress.org/Function_Reference/the_content
  6. http://codex.wordpress.org/Template_Tags/the_excerpt_rss
  7. http://codex.wordpress.org/Function_Reference/is_feed
  8. http://codex.wordpress.org/Function_Reference/get_bloginfo