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.
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.
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..
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:
Ä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.
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:
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.
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:
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. = ''; // Ende wenn return $ content; // end display_rss_note'; $ 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. = '
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.