Erweiterbare Plugins mit Aktionen und Filtern schreiben

Wenn Sie den Quellcode eines guten Plugin-Entwicklers untersuchen, finden Sie unter anderem benutzerdefinierte Hooks und Filter, die der Entwickler im gesamten Plugin platziert hat. Das Vorhandensein dieser Aktions-Hooks und Filter macht das Plugin "erweiterbar", was bedeutet, dass andere Plugins und Designs das Verhalten des Plugins beeinflussen oder ergänzen können.

Das Schreiben von erweiterbaren Plugins ist etwas, worüber ich Sie dringend bitten möchte. Es gibt eine Menge aus guten Gründen, warum Sie es tun sollten, aber sehr wenige Gründe, warum Sie diese Praxis vermeiden sollten.

Wir werden uns einige Elemente erweiterbarer Plugins ansehen:

  • Eine Erklärung dazu, was Erweiterbare Plugins sind
  • Gründe, warum Sie Erweiterbare Plugins schreiben sollten
  • Die grundlegenden Werkzeuge, die Sie brauchen
  • Wie Sie Ihre Plugins schreiben müssen, um sie erweiterbar zu machen
  • Einfache Beispiele für Hooks und Filter, um zu veranschaulichen, wie Sie diese verwenden könnten

Ein wichtiger Hinweis: In diesem Tutorial werden rein prozedurale Programmiertechniken verwendet. Alles, worüber ich hier spreche, gilt immer noch bei der Verwendung von Object Oriented Programming (OOP). Es ist jedoch einfacher, diese Techniken zunächst in einer prozeduralen Umgebung zu erlernen.


Was ist ein erweiterbares Plugin??

Ein erweiterbares Plugin ist eines, das durch ein anderes Plugin oder ein anderes Design geändert und über seinen ursprünglichen Zweck hinaus erweitert werden kann. Wenn ein Plugin erweiterbar ist, können andere Plugins (oder Designs) das Verhalten oder die Ausgabe des Plugins ändern. Beispielsweise ermöglichen E-Commerce-Plugins zusätzliche Zahlungs-Gateways, die die Verarbeitung von Einkäufen über zusätzliche Zahlungssysteme ermöglichen. Diese Zahlungs-Gateways sind separate Plugins, die sich einfach mit dem Core-Plugin verbinden und dessen Funktionalität erweitern.

Alle Plugins können erweiterbar sein, obwohl es nur eine kleine Minderheit der veröffentlichten Plugins gibt. Um erweiterbar oder modular (ein anderer Begriff für dasselbe) zu sein, muss der Entwickler eines Plugins eine bewusste Entscheidung treffen, indem er die erforderlichen Elemente implementiert, die es anderen Plugins und Themes ermöglichen, sich in das Core Plugin zu integrieren Verhalten.


Warum Extensible Plugins schreiben??

Es gibt viele gute Gründe, erweiterbare Plugins zu schreiben, aber einer der Hauptgründe ist, dass es einfach keinen guten Grund gibt nicht So schreiben Sie Ihre Plugins auf diese Weise, insbesondere nicht, wenn Ihre Plugins als kostenlose oder kostenpflichtige Plugins für die WordPress-Community freigegeben werden.

Wenn Sie erweiterbare Plugins schreiben, können Sie es anderen Entwicklern ermöglichen, Ihr Plugin zu erweitern und noch besser zu machen, ohne jedoch den Kern-Quellcode zu ändern. Sie erleichtern es Entwicklern und Benutzern außerdem erheblich, das Plugin besser an ihre Bedürfnisse anzupassen. Ich gebe Ihnen ein Beispiel: In meinem Easy Digital Downloads-Plugin gibt es ein Rabattcodesystem. Rabattcodes sind auf eine einmalige Verwendung pro Benutzer beschränkt. Wenn ein Benutzer versucht, denselben Rabatt für zwei verschiedene Einkäufe zu verwenden, wird eine Fehlermeldung angezeigt. Einer meiner Benutzer aus der Praxis stellte fest, dass sie die Preisnachlässe nicht auf einen einzelnen Verwendungszweck pro Benutzer beschränken wollte. Daher gab ich ihr eine einfache Funktion, bei der sie ein neues benutzerdefiniertes Plugin einsetzte und die Einschränkung aufgehoben wurde, ohne dabei den Code des Plugins zu berühren.

Erweiterbarer Code macht auch andere Entwickler sehr glücklich, wenn sie ihn finden, weil ihre Aufgabe, den Code anzupassen, sehr viel einfacher geworden ist.


Die grundlegenden Tools / Funktionen

Es gibt verschiedene Schlüsselwerkzeuge, die Sie zum Schreiben von erweiterbaren Plugins benötigen. Wenn Sie Plugins oder Themes geschrieben haben, bevor Sie dies lesen, sind Sie wahrscheinlich zumindest ein wenig mit diesen Funktionen vertraut, auch wenn Sie sie nur gesehen haben.

Bevor ich Ihnen die Funktionen zeige, die Sie verwenden werden, wollen wir zuerst über zwei Hauptkonzepte sprechen: Haken und Filter.

Ein Aktions-Hook ist eine Stelle in Ihrem Plugin, die von Funktionen (sowohl in Ihrem Plugin als auch in anderen Plugins) "eingebunden" werden kann, damit der Code an dieser Stelle ausgeführt wird. Wenn ein Aktions-Hook ausgeführt wird, werden auch alle damit verbundenen Funktionen ausgeführt.

Ein Filterhaken ist auch ein Ort in Ihrem Plugin, in dem andere Funktionen eingebunden werden können. Sie funktionieren jedoch etwas anders als Aktionen. Durch Filter können Daten vor ihrer Verwendung bearbeitet oder geändert werden.

Der Hauptunterschied zwischen Aktionen und Filtern besteht darin, dass Aktionen normalerweise zum Ausführen von Funktionen und Filter zum Bearbeiten von Daten verwendet werden.

Wenn Sie mit den Aktionen und Filtern nicht bereits vertraut sind, sollten Sie unbedingt den Codex-Eintrag lesen.

Für Aktionen gibt es vier Hauptfunktionen:

  • do_action () - Dies definiert einen hakenbaren Ort für Aktionen
  • add_action () - Damit wird eine Funktion an einen mit erstellten Hook angehängt do_action ()
  • has_action () - Dies prüft, ob eine Aktion bei registriert wurde do_action ()
  • remove_action () - Dadurch wird eine Aktion entfernt, die mit festgelegt wurde add_action ()

Von diesen vier werden Sie verwenden do_action () und add_action () am meisten.

Für Filter gibt es auch vier Hauptfunktionen:

  • apply_filters () - Dadurch wird ein hakenbarer Ort geschaffen, an den benutzerdefinierte Filter angeschlossen werden können
  • add_filter () - Damit wird ein benutzerdefinierter Filter an einen mit erstellten Hook angehängt apply_filters ()
  • has_filter () - Dies prüft, ob ein Filter bei registriert wurde apply_filters ()
  • remove_filter () - Dadurch wird ein zuvor verbundener Filter entfernt apply_filters ()

Wie bei Aktionen, apply_filters () und add_filter () sind die zwei, die Sie am meisten verwenden werden.

Wenn Sie an diesem Punkt verwirrt sind, machen Sie sich keine Sorgen. Wir werden uns im nächsten Abschnitt mit deren Verwendung beschäftigen.


Implementierung in eigenen Plugins

Um Ihr Plugin wirklich erweiterbar zu machen, müssen Sie die oben genannten Schlüsselfunktionen im gesamten Plugin verwenden. Zunächst können Sie Schwierigkeiten haben, umständlich, ärgerlich oder viele andere anwendbare Adjektive, diese zusätzlichen Funktionen im gesamten Code ständig zu platzieren, insbesondere wenn Sie keinen unmittelbaren Nutzen oder Nutzen für sie sehen.

Sie werden jedoch feststellen, dass, wenn Sie Ihre Plugins mit all diesen Funktionen im Auge behalten, es zur zweiten Natur wird, sie einzubeziehen.

Es gibt einige Hauptszenarien, in denen Sie Filter in Ihren Plugins verwenden werden:

  • Wenn Arrays eingerichtet sind. Hier werden Filter hinzugefügt, damit andere Plugins die Daten vor ihrer Verwendung ändern können.
  • Wenn Datenobjekte eingerichtet sind. Genau wie bei Arrays verwenden Sie einen Filter für Objekte, damit andere Entwickler das Objekt ändern können, bevor es verwendet wird.
  • Wenn Datenzeichenfolgen eingerichtet sind. Mit einem für einen String verfügbaren Filter können andere Entwickler den gesamten String ändern, Teile davon ändern oder hinzufügen.

In den oben genannten Szenarien werden am häufigsten Filter verwendet, wenn Daten zurückgegeben werden oder kurz vor deren Verwendung. Wenn Sie beispielsweise über ein Plugin verfügen, das eine Beitragsabfrage ausführt, sollten Sie das Array der Abfrageargumente vor der Weitergabe an einen Filter übergeben get_posts () oder WP_Query damit andere die Abfrage bearbeiten können, bevor sie gemacht wird.

Wenn es um Aktionen geht, gibt es mehrere Hauptinstanzen, in denen Sie sie platzieren werden:

  • Bevor eine Aufgabe ausgeführt wird.
  • Nachdem eine Aufgabe ausgeführt wurde.
  • Innerhalb Ihres Markups, um das Hinzufügen zusätzlicher Markierungen zu ermöglichen.

Betrachten wir jetzt einige Beispiele.

1. Anzeigen von HTML mit einem Shortcode

Shortcodes, die HTML ausgeben, sind extrem häufig (sie sind wahrscheinlich die allgemeinsten aller Shortcodes), und eine der Möglichkeiten, die Shortcodes unseres Plugins für andere Entwickler benutzerfreundlicher zu gestalten, besteht darin, ihnen die Möglichkeit zu geben, den Inhalt des Moduls zu ändern Shortcode, aber ohne dass es abgemeldet und erneut registriert werden muss.

Alle Shortcodes geben den Inhalt zurück, anstatt ihn zu wiederholen, was bedeutet, dass die auf dem Bildschirm ausgegebenen Daten in Form einer Zeichenfolge vorliegen, bevor sie zurückgegeben werden. Da die gesamte HTML-Ausgabe in Form einer Zeichenfolge vorliegt, können Sie die Zeichenfolge vor der Rückgabe durch einen Filter übergeben. Auf diese Weise können andere Entwickler den HTML-Code Ihres Shortcodes ändern.

Ein Entwickler möchte vor und nach dem Standard-HTML-Code zusätzliche Markierungen hinzufügen: Wenn der Filter installiert ist, können Sie dies tun.

Ihr Shortcode kann in etwa so aussehen:

 Funktion wptp_sample_shortcode (atts, $ content = null) $ html = '
'; $ html. = '

Inhalt des Beispiel-Shortcodes

'; $ html. = '
'; return $ html;

Wir können dies verbessern, indem Sie dem Return einen Filter hinzufügen.

 Funktion wptp_sample_shortcode (atts, $ content = null) $ html = '
'; $ html. = '

Inhalt des Beispiel-Shortcodes

'; $ html. = '
'; return apply_filters ('wptp_shortcode_html', $ html) zurückgeben;

Der HTML-Code in unserem Shortcode kann jetzt folgendermaßen geändert werden:

 Funktion wptp_modify_html ($ html) return '
'. $ html. '
'; add_filter ('wptp_shortcode_html', 'wptp_modify_html');

Dies führt dazu, dass der in dem Shortcode erstellte Original-HTML-Code mit einem anderen Code umhüllt wird div Etikett.

2. Abfragen von Beiträgen

Das Durchführen von benutzerdefinierten Abfragen in Plugins ist üblich. Nehmen wir einmal an, Sie haben ein Plugin geschrieben, das einen benutzerdefinierten Beitragstyp namens "Bücher" registriert und in Ihrem Plugin eine Funktion zum Anzeigen von erstellten Büchern darstellt. Ihre Funktion zum Abfragen der Bücher könnte in etwa so aussehen:

 Funktion wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5); $ books = new WP_Query ($ query_args); if ($ books-> have_posts ()): while ($ books-> have_posts ()): $ books-> the_post () // Info über jedes Buch hier anzeigen lassen; endif; wp_reset_postdata (); 

Aber was wäre, wenn ein Benutzer die Art der zurückgegebenen Bücher ändern wollte und vielleicht nur Bücher aus einer bestimmten Kategorie auswählte? Sie können ihnen das viel einfacher machen, indem Sie Folgendes tun:

 Funktion wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5, 'author' => 3); $ books = new WP_Query (apply_filters ('wptp_books_query', $ query_args)); if ($ books-> have_posts ()): while ($ books-> have_posts ()): $ books-> the_post () // Info über jedes Buch hier anzeigen lassen; endif; wp_reset_postdata (); 

Die einzige Änderung, die ich vorgenommen habe, war das Hinzufügen eines Filters $ query_args, Dies bedeutet, dass andere Entwickler (oder Benutzer) die Abfrageargumente ändern können, bevor sie tatsächlich übergeben werden WP_Query. Beispielsweise könnten Sie die Abfrage so einstellen, dass nur Bücher von Autor 3 wie folgt angezeigt werden:

 Funktion wptp_alter_books_query ($ args) $ args ['author'] = 3; return $ args;  add_filter ('wptp_books_query', 'wptp_alter_books_query');

3. Markup erweitern

Lassen Sie uns jetzt auf Beispiel Nummer 2 erweitern und es noch besser machen. Wir haben bereits einen Filter hinzugefügt, mit dem Benutzer die Abfrage ändern können. Jetzt fügen wir ein paar Hooks hinzu, damit wir den erstellten HTML-Code ändern können.

Zuerst werden wir unseren ursprünglichen HTML-Code ein wenig ändern:

 Funktion wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5, 'author' => 3); $ books = new WP_Query (apply_filters ('wptp_books_query', $ query_args); if ($ books-> have_posts ()): echo '
'; while ($ books-> have_posts ()): $ books-> the_post () echo '
'; Echo '

'. get_the_title (). '

'; Echo '
'; endtime; Echo '
'; endif; wp_reset_postdata ();

Wir möchten es nun den Entwicklern ermöglichen, zusätzliche Markierungen an verschiedenen Punkten hinzuzufügen, beispielsweise an folgenden Punkten:

  • Bevor irgendein HTML ausgegeben wird
  • Nach dem Ende von HTML
  • Vor dem Titel jedes Buches
  • Nach dem Titel jedes Buches

Sie können sich ein Szenario vorstellen, in dem ein Benutzer vor oder nach dem Buchtitel ein Miniaturbild hinzufügen möchte. Um dies zu ermöglichen, verwenden wir do_action () hakenbare Orte erstellen, wie folgt:

 Funktion wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5, 'author' => 3); $ books = new WP_Query (apply_filters ('wptp_books_query', $ query_args)); if ($ books-> have_posts ()): do_action ('wptp_books_before'); Echo '
'; while ($ books-> have_posts ()): $ books-> the_post () echo '
'; do_action ('wptp_before_book_title', get_the_ID ()); Echo '

'. get_the_title (). '

'; do_action ('wptp_after_book_title', get_the_ID ()); Echo '
'; endtime; Echo '
'; do_action ('wptp_books_after'); endif; wp_reset_postdata ();

Beachten Sie, dass die beiden inneren Haken (die den Titel umgeben) einen zweiten Parameter von haben get_the_ID (). Diese Variable, die die ID des Buchs ist, wird als Parameter für jede Hook-Funktion verfügbar sein. So fügen Sie beispielsweise ein Miniaturbild eines Buches hinzu:

 Funktion wptp_show_book_image ($ book_id) echo get_the_post_thumbnail ($ book_id, 'thumbnail');  add_action ('wptp_before_book_title', 'wptp_show_book_image');

Beispiele aus der realen Welt

Ich möchte Ihnen jetzt einige Beispiele aus der realen Welt zeigen, die erweiterbar sind, einschließlich Beispielen für einige ihrer erweiterbaren Funktionen.

1. Soliloquy

Soliloquy ist ein leistungsfähiges WordPress-Plug-In, das das Erstellen und Verwalten von responsiven, effizienten, sicheren und SEO-freundlichen Image-Sliders zum Kinderspiel macht.

Fast alles in diesem Plugin ist erweiterbar. Hier nur ein Beispiel:

 $ labels = apply_filters ('tgmsp_post_type_labels', array ('name' => __ ('Soliloquy', 'soliloquy'), 'singular_name' => __ ('Soliloquy'), 'soliloquy'), 'add_new' => __ ( 'Neu hinzufügen', 'Soliloquy'), 'add_new_item' => __ ('Neuen Soliloquy-Schieberegler hinzufügen', 'Soliloquy'), 'edit_item' => __ ('Soliloquy-Schieberegler bearbeiten', 'Soliloquy'), 'neues_item' => __ ('Neuer Soliloquy Slider', 'Soliloquy'), 'view_item' => __ ('View Soliloquy Slider', 'Soliloquy'), 'search_items' => __ ('Suche Soliloquy Sliders', 'Soliloquy') , 'not_found' => __ ('Keine Soliloquy Sliders gefunden', 'Soliloquy'), 'not_found_in_trash' => __ ('Keine Soliloquy Sliders im Papierkorb gefunden', 'Soliloquy'), 'parent_item_colon' => ',' menu_name '=> __ (' Soliloquy ',' Soliloquy ')))); $ args = apply_filters (' tgmsp_post_type_args ', array (' labels '=> $ labels,' public '=> true,' exclude_from_search '=> true,' show_ui '=> true,' show_in_admin_bar '=> false,' umschreiben '=> false,' query_var '=> false,' menu_position '=> 100,' menu_icon '=> plugins_url (' css / images / menu-icon.png ', dirname (__FILE__)),' unterstützt '=> array (' title ')));

Auf diese Weise stellt Thomas Griffin (der Entwickler des Plugins) die Argumente sowohl für die benutzerdefinierten Posttypbeschriftungen als auch für die Attribute ein. Die Anwesenheit seiner zwei Filter, tgmsp_post_type_labels und tgmsp_post_type_args, Machen Sie es anderen Entwicklern sehr leicht, den Post-Typ des Sliders umzubenennen oder die Unterstützung für den Post-Typ zu ändern.

2. bbPress

Mit Abstand eines meiner persönlichen Lieblings-Plugins aller Zeiten, ist bbPress ein voll ausgestattetes Forum-Plugin für WordPress. Das gesamte Plugin ist ein perfektes Beispiel dafür, wie Sie Ihre Plugins erweiterbar machen können, da es buchstäblich über Aktionen und Filter verfügt. Es hat einen bestimmten Filter, der angewendet wird, wenn der Inhalt eines Forums abgerufen wird:

 Funktion bbp_get_forum_content ($ forum_id = 0) $ forum_id = bbp_get_forum_id ($ forum_id); // Prüfen Sie, ob ein Kennwort erforderlich ist, wenn (post_password_required ($ forum_id)) return get_the_password_form (); $ content = get_post_field ('post_content', $ forum_id); return apply_filters ('bbp_get_forum_content', $ content, $ forum_id) zurückgeben; 

Bevor der Inhalt des Forums zurückgegeben wird, wird er durch einen aufgerufenen Filter geleitet bbp_get_forum_content Auf diese Weise kann ein Entwickler den Inhalt ändern, bevor er angezeigt wird.

3. Einfache digitale Downloads

Easy Digital Downloads (EDD) ist eines meiner Plugins, das so konzipiert wurde, dass der Verkauf digitaler Produkte über WordPress außergewöhnlich einfach ist. Wie bei den meisten E-Commerce-Plugins verfügt EDD über einen Checkout-Prozess, den der Käufer durchläuft, um seine persönlichen Daten und Zahlungsinformationen einzugeben. Nachdem alle diese Informationen gesammelt wurden, werden sie an ein Zahlungs-Gateway (ein System zur Verarbeitung der Zahlung) weitergeleitet. Bevor sie jedoch an das Gateway gesendet wird, wird ein Filter angewendet, mit dem die Daten manipuliert werden können, bevor sie von der Zahlung verwendet werden System:

 $ purchase_data = apply_filters ('edd_purchase_data_before_gateway', $ purchase_data, $ valid_data);

Das Vorhandensein dieses Filters ermöglicht das Anpassen der Kaufbeträge (z. B. für spezielle Rabatte), das Hinzufügen von Steuern, das Hinzufügen oder Entfernen von Produkten aus dem Kauf und vieles mehr.


Fazit

Erweiterbare Plugins profitieren alle: den ursprünglichen Entwickler, andere Entwickler und die Benutzer selbst.

Es gibt so viele Gründe, warum Sie Ihre Plugins mit erweiterbarem Code schreiben sollten. Warum also nicht??

Die hier vorgestellten Tools sind alles, was Sie benötigen, um loszulegen. Habe Fragen? Fragen Sie weg!