Zwei Möglichkeiten zur Entwicklung von WordPress-Plugins Objektorientierte Programmierung

Beim Schreiben von WordPress-Plugins gibt es im Allgemeinen zwei Möglichkeiten, dies zu tun: objektorientierte Programmierung und funktionale Programmierung (Widgets bilden die Ausnahme - wir behandeln das später in diesem Artikel)..

Obwohl Sie im Allgemeinen über Leute verfügen, die sich für einen Programmierstil gegenüber dem anderen verbürgen, bietet jeder seine eigenen Vor- und Nachteile.

In dieser zweiteiligen Serie werden Stephen Harris und ich die zwei Möglichkeiten aufzeigen, wie Sie WordPress-Plugins schreiben können. Insbesondere werde ich über objektorientierte Programmierung sprechen, und er wird sich mit funktionaler Programmierung befassen.

Da das Erfahrungsniveau der Leser unterschiedlich ist, werden wir über das Programmieren auf hohem Niveau sprechen. Wenn Sie also Anfänger sind, sollten Sie kein Problem damit haben. Wenn Sie jedoch ein erfahrener Entwickler sind, finden Sie später im Artikel weitere nützliche Informationen.

Beginnen wir mit dem objektorientierten Ansatz bei der Entwicklung von WordPress-Plugins.


Entwickeln von WordPress-Widgets

Wie in der Einführung erwähnt, können Plugins auf zwei Arten für WordPress entwickelt werden:

  1. Objekt orientierte Programmierung
  2. Funktionale Programmierung

Der zweite Artikel der Serie befasst sich mit der funktionalen Programmierung. Wir möchten jedoch eine Definition der objektorientierten Programmierung angeben, sodass wir uns in diesem Artikel auf der gleichen Ebene befinden.

Wikipedia sagt:

Objektorientierte Programmierung (OOP) ist ein Programmierparadigma, bei dem "Objekte" - normalerweise Instanzen einer Klasse - bestehend aus Datenfeldern und Methoden zusammen mit ihren Interaktionen - zum Entwerfen von Anwendungen und Computerprogrammen verwendet werden.

Diejenigen, die mehr Erfahrung mit Computerprogrammierung haben, insbesondere Diejenigen, die objektorientierte Programmiertechniken verwenden, werden diese Definition wahrscheinlich mögen.

Aber vereinfachen wir es für die Zwecke dieses Artikels:

Objektorientierte Programmierung ist eine Programmiertechnik, die eine Sammlung verwandter Methoden verwendet, um ein Computerprogramm oder einen Teil eines Computerprogramms zu definieren.

Einfach genug, richtig? In unserem Fall sind unsere Plugins definitiv Teil eines Computerprogramms, da sie in WordPress hängen.

Obwohl wir uns den Rest dieses Artikels mit Code beschäftigen, beachten Sie, dass objektorientierte Programme durch die Gruppierung ihrer zugehörigen Methoden und identifiziert werden Das geschieht im Kontext einer Klasse, die wir kurz behandeln werden.

Ein Wort über Widgets

Obwohl es stimmt, dass WordPress-Plugins mit OOP oder funktionaler Programmierung entwickelt werden können, gibt es bei der Entwicklung von Widgets eine Ausnahme.

Gemäß dem Codex-Artikel zum Entwickeln von Widgets muss die folgende Struktur zum Schreiben eines Widgets verwendet werden:

Die Klasse My_Widget erweitert die WP_Widget public function __construct () // tatsächliche Aktualprozesse des Widgets ($ instance) // gibt das Optionsformular auf admin aus zu speichern public function widget ($ args, $ instance) // gibt den Inhalt des Widgets aus

Das bedeutet, dass alles Widgets sollten mit OOP geschrieben werden. Wenn Sie keinen Code wie den oben genannten gesehen haben, werden wir im nächsten Abschnitt darauf eingehen. Er sollte alles bieten, was Sie wissen müssen, um zu verstehen, was los ist.


Eine kurze Einführung in OOP

Bevor wir mit dem Erstellen von OOP-basierten Plugins für WordPress beginnen, sollten wir uns die Grundlagen von OOP genauer ansehen, um sicherzustellen, dass wir uns mit der Terminologie und der Funktionsweise des Paradigmas auskennen.

Klassen

Wie zuvor definiert, verwendet OOP "eine Sammlung verwandter Methoden". Aber wir können dort nicht aufhören. Denn funktionale Programmierung macht dasselbe.

In OOP sind diese "verwandten Methoden" alle im Zusammenhang mit dem, was als a bezeichnet wird Klasse. Im Beispiel-Widget oben sehen Sie das Klasse Schlüsselwort als erstes Wort im Code.

Es beginnt mit einer Zeile, die mit einer öffnenden Klammer endet (ähnlich wie bei Funktionen), und kapselt alle zugehörigen Funktionen, bevor sie mit der schließenden Klammer endet (oder ignoriert sie.) erweitert Stichwort im Widget-Beispiel - wir werden das gleich ansprechen..

Eine logische Gruppierung von Funktionen

Wenn Sie gerade erst mit dem Schreiben von Klassen beginnen und sich fragen, ob eine Funktion zu einer bestimmten Klasse gehört, fragen Sie sich, ob die Funktion wie eine bestimmte Klasse klingt.

Zum Beispiel im Widget-Beispiel oben aktualisieren Methode ist offensichtlich etwas, was ein Widget tun würde. Angenommen, Sie schreiben eine Klasse, die für das Lesen eines Blogbeitrags in der WordPress-Datenbank verantwortlich ist. Es wäre sinnvoll, für diese bestimmte Klasse eine Funktion aufzurufen lesen oder read_by_id, Aber sollte es eine Funktion haben schreiben? Wie wäre es mit löschen?

Je nachdem, wie Sie Ihre Klasse entworfen haben. Aber wenn die Sohle, einzig, alleinig Zweck der Klasse ist das Lesen von Daten, dann wahrscheinlich nicht.

Und das ist OOP: Es ist logisch, Ihre Funktionen in einer Klasse zusammenzufassen, aber die logische Gruppierung hängt von der Verantwortung ab, die Sie Ihrer Klasse geben.

Fortgeschrittene Themen in OOP

OOP ist ein mächtiges Paradigma, das in der gesamten WordPress-Anwendung zum Einsatz kommt. OOP erlaubt fortgeschrittene Operationen wie Vererbung (die durch die dargestellt wird) erweitert Schlüsselwort in der Widget-Klasse), Entwurfsmuster, die im Wesentlichen vorhandene Lösungen für allgemeine Probleme sind.

Dieser Artikel versucht nicht, sich eingehend mit objektorientierter Programmierung zu beschäftigen. Es wird lediglich versucht, eine Grundlage zu schaffen, auf der wir die beiden Schreibweisen für WordPress-Plugins untersuchen können, aber ich erwähne sie hier, wenn Sie daran interessiert sind, weiter in die objektorientierte Programmierung einzutauchen.


Klassenbasierte Plugins entwickeln

Nun, da wir objektorientierte Programmierung definiert und gerade genug erforscht haben, um ein Fundament zu legen, ist es jetzt an der Zeit, über die Komponenten der OOP-basierten Entwicklung im Kontext von WordPress-Plugins zu sprechen.

Im weiteren Verlauf dieses Artikels werden wir die Grundlagen für das Schreiben von OOP-basierten Plugins und die damit verbundenen Vorteile behandeln.

Klasse definieren

Bevor du das tust etwas In der objektorientierten Entwicklung müssen Sie Ihre Klasse definieren. Wenn Sie davon ausgehen, dass Sie bereits eine Vorstellung davon haben, was Ihre Klasse tun soll, müssen Sie in der Regel wissen, was Sie Ihrer Klasse nennen wollen.

In den meisten Fällen denke ich, dass das Anzeigen von Beispielcode beim Lehren von Code immer von Vorteil ist. Wir werden uns daher die WordPress Plugin Boilerplate ansehen.

Beachten Sie, dass es sich bei der Plugin-Boilerplate um ein Projekt handelt, das ich ursprünglich erstellt habe, um OOP-basierte Plugins zu starten. Es wurde seitdem von verschiedenen Personen beigetragen. Ich verwende es in diesem Artikel, weil es das vorliegende Thema veranschaulicht.

Beachten Sie jedoch, dass die Klassendefinition für die Plugin-Boilerplate folgendermaßen aussieht:

class PluginName // Weitere werden folgen…

Da die Plugin-Boilerplate ein Ausgangspunkt für die Entwicklung ist, würden wir die Klasse offensichtlich umbenennen. Nennen wir es für diesen Artikel DemoPlugin.

Klasse DemoPlugin // Weitere werden folgen…

An diesem Punkt können wir mit der Definition von Funktionen beginnen, die innerhalb der Klasse leben.

Der Konstruktor

In OOP ist die erste Funktion, die Sie wahrscheinlich in einer Klasse sehen werden, eine Funktion, die "Konstruktor" genannt wird, und PHP unterscheidet sich nicht.

Eine einfache funktionierende Definition des Konstruktors lautet:

Im Konstruktor initialisieren Sie Daten, die in der gesamten Klasse verwendet werden.

Wie dies funktioniert, ist von Projekt zu Projekt unterschiedlich, aber im Zusammenhang mit einem WordPress-Plugin können wir vor allem zwei Dinge tun:

  1. Richten Sie die Textdomäne für Lokalisierungszwecke ein
  2. Definieren Sie unsere Aktionen und Filter (insbesondere unsere Aktionen und unsere Filter)..

In unserer DemoPlugin, wir werden genau das tun. Wir setzen eine Textdomain von Demo-Plugin und wir registrieren Aktionen für die Registrierung und Eingabe eines Beispiel-Stylesheets und einer JavaScript-Beispieldatei.

Um unser Beispiel zu vervollständigen, registrieren wir auch einen Hook, um Text an das Ende des Inhalts anzuhängen, der in einem Beitrag angezeigt wird.

Zuerst definieren wir den Konstruktor:

Klasse DemoPlugin öffentliche Funktion __construct () 

Beachten Sie, dass in PHP ein Konstruktor durch eine öffentliche Funktion mit dem Namen definiert wird konstruieren Dem folgen zwei Unterstriche.

Als Nächstes definieren wir unsere Textdomain:

class DemoPlugin public function __construct () load_plugin_textdomain ('demo-plugin', false, dirname (plugin_basename (__FILE__)). '/ lang'); 

Beachten Sie in der obigen Codezeile, dass wir den Schlüssel für unsere Textdomäne definiert haben Demo-Plugin Die Zeile erwartet, die Lokalisierungsdateien in einem Unterverzeichnis zu finden lang im Plugin-Verzeichnis.

Da die Lokalisierung für diesen Artikel nicht geeignet ist, werde ich nicht weiter tauchen. Sie können jedoch den Quellcode für die Plugin-Boilerplate überprüfen, um zu sehen, wie dies eingerichtet wird.

Als Nächstes definieren wir die Aktionen für die Registrierung unserer Stylesheets und JavaScript sowie den Filter, der Text an das Ende unseres Inhalts anfügt:

class DemoPlugin public function __construct () load_plugin_textdomain ('demo-plugin', false, dirname (plugin_basename (__FILE__)). '/ lang'); add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_styles')); add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts')); add_filter ('the_content', array ($ this, 'append_post_notification')); 

Wenn Sie mit Aktionen und Filtern nicht vertraut sind, lesen Sie auf jeden Fall einen meiner letzten Artikel über Wptuts +, da dies den Unterschied erklärt.

Wenn Sie nun mit der WordPress-Theme-Entwicklung oder der funktionalen Programmierung vertraut sind, werden Sie wahrscheinlich Folgendes sehen:

add_action ('wp_enqueue_scripts', 'register_plugin_styles');

Eher, als:

add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_styles'));

Beachten Sie, dass der Unterschied zwischen den beiden obigen Aufrufen im zweiten Parameter liegt. In unserem Plugin übergeben wir ein Array, während die erste Codezeile einfach eine Zeichenfolge enthält.

Da wir dieses Plugin mit OOP entwickeln, muss WordPress wissen, wo das aufgerufen werden soll register_plugin_styles Methode. Da es in unserer Klasse lebt, müssen wir WordPress anweisen, die Methode für eine Instanz unserer Klasse aufzurufen.

Sinn ergeben?

Im Wesentlichen sagen wir WordPress: Ich habe diese Methode aufgerufen register_plugin_styles, Sie müssen es jedoch für eine Instanz dieser Klasse aufrufen (daher die diese Stichwort).

Wenn Sie WordPress noch nicht kennen, aber aus einem Programmierhintergrund kommen, können Sie sich vorstellen, dass Sie WordPress dazu auffordern, dies zu tun:

$ demo = neues DemoPlugin (); $ demo-> register_plugin_styles ();

Die Quintessenz ist jedoch: Wenn Sie Ihre Plugins mit OOP entwickeln, dann Sie Muss Registrieren Sie Ihre Hooks mit einem Array mit zwei Indizes: dem ersten $ das und der zweite ist der Name der Funktion.

Ein Hinweis zu Pass-by-Reference und Pass-by-Value

Fortgeschrittene Entwickler werden mit der Fähigkeit von PHP vertraut sein, Referenzen zu übergeben und Werte zu übergeben. In WordPress Development ist es nicht ungewöhnlich, Folgendes zu sehen:

add_action ('wp_enqueue_scripts', array (& $ this, 'register_plugin_styles'));

Woher diese wird als Referenz übergeben; Ab PHP 5.4 wurde jedoch die Möglichkeit entfernt, Variablen per Verweis zum Zeitpunkt des Aufrufs zu übergeben. Aus diesem Grund entscheidet sich dieses Tutorial für den Wertübergang.

Funktionen

Bei der Programmierung sind Funktionen die Codeeinheiten, die im Wesentlichen für "etwas tun" verantwortlich sind. Bei der objektorientierten Programmierung ist es hilfreich, etwas anders zu denken.

In OOP werden Klassen normalerweise durch Substantive dargestellt. In unserem Fall haben wir eine DemoPlugin. In ähnlicher Weise sind Funktionen häufig Verben. Das heißt, es sind Aktionen, die unser Substantiv ausführen kann. Zu diesem Zeitpunkt haben wir uns bereits entschieden, die folgenden Funktionen zu definieren:

  • register_plugin_styles
  • register_plugin_scripts
  • append_post_notification

Beachten Sie, wie jeder Funktionsname eine Aktion darstellt, die ausgeführt werden kann. Dies ist eine gute Faustregel beim Schreiben von Funktionen.

In der funktionalen Programmierung gibt es eigentlich nur die Vorstellung von Funktionen. In OOP gibt es jedoch verschiedene Arten von Funktionen, von denen zwei "öffentliche" Funktionen und "private" Funktionen sind.

Öffentliche Funktionen

Öffentliche Funktionen sind Funktionen, auf die außerhalb der Klasse zugegriffen werden kann. Das bedeutet, dass Sie diese Methoden aufrufen können, sobald Sie die Klasse instanziiert haben.

Genau das haben wir zuvor im folgenden Code gemacht:

$ demo = neues DemoPlugin (); $ demo-> register_plugin_styles ();

Grundsätzlich sind diese Funktionen für die Öffentlichkeit zugänglich (wobei die Öffentlichkeit ein Programmierer oder ein anderes Objekt sein kann)..

Die Funktionen, die wir schreiben, um unsere Stylesheets, unser JavaScript zu registrieren, und die wir schreiben, um Text an einen Beitrag anzufügen haben da als öffentlich zu kennzeichnen werden ein Dritter sein, der sie anfordert - WordPress.

Definieren Sie die beiden Funktionen für die wp_enqueue_scripts Aktion:

public function register_plugin_styles () wp_register_style ('demo-plugin', plugins_url ('demo-plugin / css / plugin')); wp_enqueue_style ('demo-plugin');  public function register_plugin_scripts () wp_register_script ('demo-plugin', plugins_url ('demo-plugin / js / display.js')); wp_enqueue_script ('demo-plugin'); 

Beachten Sie erneut, dass diese beiden Funktionen erwarten, dass sich die Stylesheets und JavaScript befinden css und js Unterverzeichnisse. Um dies in Aktion zu sehen, sollten Sie die Plugin Boilerplate auschecken.

Schließlich definieren wir die Funktion für der Inhalt Filter:

public function append_post_notification ($ content) $ notification = __ ('Diese Nachricht wurde mit einem Demo-Plugin angehängt.', 'demo-plugin-locale'); $ content zurückgeben $ Benachrichtigung; 

Beachten Sie, dass wir die __-Funktion verwenden, um sicherzustellen, dass unser Skript mit der lokalisiert wird Textdomain dass wir im Konstruktor definiert haben.

Private Funktionen

Wenn öffentliche Methoden für jedermann zugänglich sind, bedeutet dies, dass private Funktionen für niemanden verfügbar sind, oder? Meistens ist das richtig: Die einzige Person - oder Ding - das können private Methoden aufrufen sind die Klasse, in der sie definiert sind.

Das bedeutet, dass WordPress, Fremdanbieterobjekte oder Programmierer private Funktionen programmgesteuert aufrufen können. Private Funktionen können nur von der Klasse aus aufgerufen werden, in der sie verwendet werden.

Im Allgemeinen sind private Funktionen beim Schreiben von Hilfsmethoden sehr nützlich - das heißt, sie sind für die interne Bearbeitung von Daten hilfreich, um eine andere Funktion bei der Ausführung ihrer Aufgabe zu unterstützen.

Um ein funktionierendes Beispiel zu geben, definieren wir eine private Funktion, die eine lokalisierte Zeichenfolge zurückgibt append_post_notification Funktion kann verwenden:

private Funktion get_localized_notification () return __ ('Diese Nachricht wurde mit einem Demo-Plugin angehängt.', 'demo-plugin-locale'); 

Als nächstes wollen wir das umgestalten append_post_notification Funktion, um diesen neuen Helfer aufzurufen:

öffentliche Funktion append_post_notification ($ content) return $ content. $ this-> get_localized_notification (); 

Beachten Sie, dass wir die erste Funktion durch Hinzufügen einer zweiten Funktion vereinfacht haben. Sie könnten auch argumentieren, dass wir die Lesbarkeit der ursprünglichen Funktion verbessert haben, indem Sie einen Aufruf an eine Funktion mit einem Namen hinzugefügt haben, der hilft zu klären, was passiert.

Das Wichtigste dabei ist vielleicht, dass Sie zum Aufruf privater Funktionen den Funktionsaufruf mit dem vorangestellten Befehl voranstellen müssen $ das Stichwort und die ->. Dies sagt PHP: "Aufruf der get_localized_notification Funktion, die in lebt diese Klasse."

Jedenfalls haben wir jeder Methode eine einzige Verantwortung zugewiesen - eine weitere bewährte Methode in der objektorientierten Programmierung - und wir haben die Verwendung sowohl öffentlicher als auch privater Funktionen demonstriert.

Andere Funktionsarten

Bei der objektorientierten Programmierung gibt es auch andere Arten von Funktionen, die über den Rahmen dieses Artikels hinausgehen.

Der Vollständigkeit halber wollte ich sie hier zusammenfassen:

  • Statische Funktionen sind Funktionen, für die kein Aufruf einer Instanz einer Klasse erforderlich ist. Stattdessen können Sie sie einfach direkt über den Namen der Klasse aufrufen. Zum Beispiel: DemoPlugin :: use_this_static_method ().
  • Geschützte Funktionen sind mit Ausnahme von Unterklassen wie private Funktionen. Das heißt, die einzigen Objekte, die auf geschützte Funktionen zugreifen können, sind Unterklassen der angegebenen Klasse. Diese besondere Art von Funktion spielt mit dem Begriff der Vererbung, der zuvor in dem Artikel erwähnt wurde.

Vorteile in WordPress

An dieser Stelle haben wir alle hohen Hinweise für die objektorientierte WordPress-Entwicklung getroffen. Die Vorteile zusammenfassen:

1. Alle Funktionen stehen im Kontext

Bei der objektorientierten Programmierung müssen Sie einer Funktion weder den Namen des Designs oder den Namen des Plugins voranstellen, an dem Sie gerade arbeiten, noch müssen Sie sich Gedanken machen, ob Sie eine Funktion benennen, die etwas stören könnte eine WordPress-Funktion, die Funktion eines anderen Themas oder die Funktion eines anderen Plugins.

Stattdessen leben alle Funktionen im Kontext einer anderen Klasse. Die einzige Sache, die Sie sicherstellen müssen, ist, dass Ihre Klasse nicht als etwas bezeichnet wird, das mit einer anderen vorhandenen Klasse interagiert.

2. Aufruf außerhalb der API

Durch die objektorientierte Programmierung können Sie Ihr Plugin programmgesteuert außerhalb der Standard-WordPress-API aufrufen.

Nehmen wir an, Sie entwickeln ein Design und möchten, dass etwas in der Seitenleiste Ihres Plugins gerendert wird. In der Sidebar-Vorlage können Sie Ihr Plugin tatsächlich instanziieren und Methoden darauf aufrufen, damit Informationen in die Sidebar geschrieben werden.

Dies ist besonders nützlich, wenn Sie an einer Vorlage arbeiten und einige Standarddaten angeben möchten, wenn der Benutzer nichts manuell eingibt.


Fazit

Wie wir zu Beginn des Artikels sagten: Dies ist nur eine Möglichkeit, wie Sie Ihre WordPress-Plugins entwickeln können. In Stephens Artikel wird beschrieben, wie dies mit der funktionalen Programmierung geschieht.

Nachdem Sie diesen Artikel gelesen haben, sollten Sie die objektorientierte Programmierung und deren Vorteile besser verstehen und in der Lage sein, Code zu folgen, der in der Widget-API, in meiner verwandten Widget-Boilerplate und sogar überall in der WordPress-Codebase dokumentiert ist.


Ressourcen

  • Stephen Harris
  • Wikipedia zu OOP
  • Ein Plugin schreiben
  • Plugin-API
  • Widget-API
  • WordPress Widget Boilerplate
  • WordPress Plugin Boilerplate
  • Textdomain
  • Aktionsreferenz
  • Filterreferenz
  • __