Bessere APIs und Bibliotheken für WordPress schreiben

Es fühlt sich an, als sei alles, was wir anfassen, sorgfältig gestaltet: Websites, Telefone, U-Bahn-Karten und so weiter. Sogar die Dinge, die wir für selbstverständlich hielten: Thermostate, Rauchmelder und Armaturenbretter werden jetzt sorgfältig behandelt.

Beim Design geht es nicht nur um das Look & Feel: Es geht darum, alle Möglichkeiten zu berücksichtigen, die ein Benutzer benötigt, um mit unserem Gerät / Werkzeug / Bildschirm / Objekt zu interagieren. 

Dies gilt auch für die Programmierung.

(Un) gestaltete Programmierung

Programmiersprachen sind große, komplizierte Welten. Sogar PHP, für das viele Programmiersnobs zu "einfach" sind, ist eigentlich eine ziemlich komplizierte Mischung aus Funktionen und Klassen, die sich sehr inkonsistent verhalten. 

Die Syntax, die Methoden und die Benennung haben sich über viele Jahre hinweg für Millionen verschiedener Benutzer und Anwendungen entwickelt. Die meisten neigen dazu, die zugrunde liegende Konstruktion der Interna zu reflektieren - nicht unbedingt, wie Sie sie verwenden möchten.

Große Momente im API-Design: jQuery

Als ich 2006 angefangen habe, JavaScript zu schreiben, war es ein Durcheinander. So würde ich einen Tag mit einer bestimmten Klasse finden und ihn dann im DOM verschieben:

var uls = getElementsByTagName ("ul"); var classToSearch = "Lebensmittel"; für (var i = 0; i < uls.length; i++)  var classes = uls[i].getClasses(); for (var j = 0; j < classes.length; j++) if (classes[j] == classToSearch) myUL = uls[i];    var $li = document.createElement('li'); $li.innerHTML = 'Steak'; myUL.innerHTML += $li;

Erledigt!

jQuery hat JavaScript wieder zum Spaß gemacht. In den späten 2000er Jahren war der Effekt so dramatisch, dass ich mich daran erinnere, dass mein Vater mich nach "etwas jkwery-Ding" gefragt hatte, über das er im Wall Street Journal gelesen hatte. Trotz des großen Effekts hat jQuery JavaScript nicht um "neue Funktionen" erweitert. Es dauerte nur die Dinge, die die Entwickler machen mussten, und es in wirklich klare Muster unterteilt.

Anstatt das Auffinden von Dingen auf der Seite neu zu erfinden, nutzten sie das, was die Leute bereits wussten: CSS-Selektoren. Dann war es nur noch eine Frage der Sammlung der üblichen Aktionen und deren Organisation in ein paar Dutzend Funktionen. Versuchen wir es mit dem vorherigen Beispiel noch einmal, jetzt mit jQuery:

var $ li = $ ('
  • Steak
  • '); $ ("ul.foods"). anhängen ($ li);

    2006 kaufte ich ein 680-seitiges Buch über Ajax. Mit der großartigen API von jQuery wurde dies so ziemlich wie folgt ersetzt:

    $ .post ();

    Die WordPress-API

    Obwohl die API "Drittanbieter-Service" bedeutet, bedeutet dies einfach, dass die Programmierschnittstelle mit einem System kommunizieren soll. Genau wie es eine Twitter-API oder eine Facebook-API gibt, gibt es auch eine WordPress-API. Du machst keine rohen Datenbankabfragen, um einen Beitrag zu erstellen, richtig? Sie verwenden wp_insert_post.

    Viele Designlöcher plagen jedoch die WordPress-API. Sie könnten verwenden get_the_title aber get_the_permalink erzeugt einen Fehler, den Sie verwenden get_permalink. Hey, wenn Sie ein jahrzehntelanges Open-Source-Projekt haben, an dem Tausende von Benutzern Code und Millionen von Benutzern beteiligt sind: Sie bekommen ein paar Macken.

    Sie können sich viel Zeit sparen, indem Sie diese Macken maskieren und die Gewohnheiten und Verhaltensweisen des Programmierers, für den Sie schreiben, schreiben (was möglicherweise der Fall ist) Sie). Hier können Sie die richtige Benutzeroberfläche entwerfen, um die Plugins und Designs zu programmieren, die Sie täglich ausführen.


    Die Lösung

    Um unsere Arbeit zu beschleunigen und sich wiederholende Aufgaben zu reduzieren, habe ich Bibliotheken erstellt, um die Befehle und Anpassungen zu handhaben, die ich ständig benötige.

    1. Tastenkombinationen für allgemeine Aufgaben

    Nehmen Sie zum Beispiel die Quelle der Miniaturansicht eines Beitrags. Es stellt sich heraus, dass es keine eingebaute WordPress-Funktion gibt, um ein Miniaturbild basierend auf der ID eines Beitrags zu erfassen (nur die Befestigung ICH WÜRDE). 

    Was bedeutet, dass ich dies oft finde:

    $ thumb_id = get_post_thumbnail_id (get_the_ID ()); $ src = wp_get_attachment_thumb_url ($ thumb_id); Echo '';

    Aber es muss einen besseren Weg geben!

    Funktion get_thumbnail_src ($ post) $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); return $ src;  Echo '';

    2: Unvorhersehbare Eingänge, vorhersagbarer Ausgang

    Viel besser! Tatsächlich verwenden Sie es ständig und teilen es dann mit anderen Entwicklern in Ihrem Unternehmen. 

    Ihr Freund hat Probleme damit, also ruft er Sie zum Debuggen an und Sie sehen:

    Echo '';

    So sieht es aus, als hätte er versehentlich gebraucht get_post anstatt get_the_ID. Sie schreien ihn an. Aber warte eine Sekunde, warum nicht mache es mehr anzunehmen? 

    Vielleicht können wir unsere Funktion so anpassen, dass sie eine WP_Post Objekt und geben dem Benutzer immer noch das, was er erwartet. Gehen wir zurück zu dieser Funktion:

    Funktion get_thumbnail_src ($ post) if (is_object ($ post) & & isset ($ post-> ID)) $ post = $ post-> ID;  else if (is_array ($ post) & & isset ($ post ['ID'])) $ post = $ post ['ID'];  $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); return $ src; 

    Also wenn sie eine senden WP_Post Objekt oder Ein Array, Ihre Funktion wird ihnen immer noch helfen, das zu bekommen, was sie brauchen. Dies ist ein großer Teil einer erfolgreichen API: die unordentlichen Köpfe zu verbergen. Sie können separate Funktionen für erstellen get_thumbnail_src_by_post_id und get_thumbnail_src_by_wp_post_object. 

    Für kompliziertere Transformationen kann dies sogar vorzuziehen sein. Sie können die Schnittstelle jedoch vereinfachen, indem Sie eine einzige Funktion zur richtigen Subroutine leiten. Unabhängig von dem, was der Benutzer sendet, gibt die Funktion immer eine Zeichenfolge für die Bildquelle zurück. 

    Machen wir weiter: Was ist, wenn sie senden? nichts?

    3. Sensible Defaults

    Funktion get_thumbnail_src ($ post = false) if (false === $ post) $ post = get_the_ID ();  else if (is_object ($ post) && isset ($ post-> ID)) $ post = $ post-> ID;  else if (is_array ($ post) & & isset ($ post ['ID'])) $ post = $ post ['ID'];  $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); return $ src; 

    Wir haben uns noch einmal vereinfacht, so dass der Benutzer keinen Beitrag senden muss oder sogar eine Post ID. In der Schleife ist alles was benötigt wird:

    Echo '';

    Unsere Funktion verwendet standardmäßig die ID des aktuellen Beitrags. Dies wird zu einer wirklich wertvollen Funktion. Um sicherzustellen, dass dies gut funktioniert, packen wir es in eine Klasse, damit der globale Namespace nicht verschmutzt wird.

    / * Plugin Name: JaredTools Beschreibung: Meine Toolbox für WordPress-Themes. Autor: Jared Novack Version: 0.1 Author URI: http://upstatement.com/ * / class JaredsTools öffentliche statische Funktion get_thumbnail_src ($ post = false) if (false === $ post) $ post = get_the_ID () ;  else if (is_object ($ post) && isset ($ post-> ID)) $ post = $ post-> ID;  else if (is_array ($ post) & & isset ($ post ['ID'])) $ post = $ post ['ID'];  $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); return $ src; 

    Und Bitte Füge deiner Klasse nicht ein WP. Ich mache diese Funktion zu einer öffentlichen statischen Funktion, weil ich will, dass sie überall verfügbar ist, und sie ändert sich nicht: Die Eingabe oder Ausführung ändert die Funktion oder das Objekt nicht. 

    Der letzte Aufruf dieser Funktion lautet:

    Echo '';

    Zuerst entwerfen, später erstellen

    Lassen Sie uns auf ein komplizierteres Bedürfnis eingehen. Wenn ich Plugins schreibe, muss ich immer verschiedene Arten von Fehler- und / oder Aktualisierungsnachrichten generieren. 

    Aber die ereignisbasierte Syntax hat mich immer gestört:

    add_action ('admin_notices', 'show_my_notice'); functon show_my_notice () echo '

    Ihre Sache wurde aktualisiert

    ';

    Es gibt viele gute Gründe, warum WordPress diese ereignisbasierte Architektur verwendet. Dies ist jedoch nicht intuitiv, es sei denn, Sie möchten verschiedene Filter und Aktionen speichern. 

    Lassen Sie uns diese Übereinstimmung zum einfachsten Anwendungsfall machen: Ich muss einen Administratorhinweis anzeigen. Ich mag es, diese API zuerst zu entwerfen: Wo finde ich heraus, wie ich die Funktion in meinem Code am besten beschreiben kann? Ich möchte es so lesen:

    Funktion thing_that_happens_in_my_plugin ($ post_id, $ value) $ aktualisiert = update_post_meta ($ post_id, $ value); if ($ updated) JaredsTools :: show_admin_notice ("Ihr Ding wurde aktualisiert") else JaredsTools :: show_admin_notice ("Fehler beim Aktualisieren Ihres Dings", "error"); 

    Sobald ich den Endpunkt entworfen habe, kann ich die Designanforderung erfüllen:

    class JaredsTools öffentliche statische Funktion show_admin_notice ($ message, $ class = 'updated') add_action ('admin_notices', function () use ($ message, $ class) echo '

    '. $ message.'

    '; );

    Viel besser! Jetzt muss ich nicht all diese zusätzlichen Funktionen erstellen oder mich an verrückte Hakennamen erinnern. Hier verwende ich anonyme PHP-Funktionen (auch "Schließungen" genannt), mit denen wir eine Funktion direkt an eine Aktion oder einen Filter binden können. 

    Dies erspart Ihnen eine Reihe zusätzlicher Funktionen, die sich in Ihren Dateien befinden. Das benutzen Mit dem Befehl können wir Argumente von der übergeordneten Funktion an die untergeordnete Schließung übergeben.

    Sei intuitiv

    Jetzt ruft ein anderer Mitarbeiter Sie an. Sie weiß nicht, warum ihre Administratorbenachrichtigung nicht rot wird:

    JaredsTools :: show_admin_notice ("Fehler beim Aktualisieren Ihres Dings", "Rot");

    Das liegt daran, dass sie "rot" sendet (was erwartet hätte, dass die Box rot wird), obwohl sie eigentlich den Namen der senden soll Klasse Das löst aus rot. Aber warum es nicht einfacher machen?

    öffentliche statische Funktion show_notice ($ message, $ class = 'updated') $ class = trim (strtolower ($ class)); if ('yellow' == $ class) $ class = 'aktualisiert';  if ('red' == $ class) $ class = 'error';  add_action ('admin_notices', function () use ($ text, $ class) echo ')

    '. $ text. '

    '; );

    Wir haben uns jetzt für mehr Anwendertoleranz einverstanden erklärt, die es einfacher machen wird, sie weiterzugeben, und für uns, wenn wir sie in einigen Monaten wiederverwenden.


    Fazit

    Nachdem ich einige davon aufgebaut habe, sind hier einige Prinzipien, die ich gelernt habe, um sie für mein Team und mich wirklich nützlich zu machen.

    1. Entwerfen Sie zuerst und lassen Sie die Funktionsweise der Funktion den Wünschen der Benutzer entsprechen.
    2. Speichern Sie Ihre Tastatur! Erstellen Sie Verknüpfungen für allgemeine Aufgaben.
    3. Geben Sie vernünftige Standardwerte an.
    4. Sei minimal. Lassen Sie Ihre Bibliothek die Verarbeitung übernehmen.
    5. Verzeihen Sie die Eingabe, aber präzise bei der Ausgabe.
    6. Verwenden Sie so wenig Funktionsargumente wie möglich, vier sind eine gute max. Danach sollten Sie es zu einem Optionsfeld machen.
    7. Organisieren Sie Ihre Bibliothek in separaten Klassen, um verschiedene Bereiche abzudecken (Administrator, Bilder, benutzerdefinierte Beiträge usw.)..
    8. Dokument mit Beispielcode.

    Bei Upstatement erleichtern unsere Bibliotheken für Timber das Erstellen von Designs. Mit Jigsaw stehen zeitsparende Verknüpfungen zum Anpassen der einzelnen Installationen zur Verfügung.

    Durch die Zeitersparnis, die diese Tools bieten, können wir mehr Zeit für die Entwicklung der neuen und innovativen Teile jeder Site oder App aufwenden. Indem Sie die Befehle übernehmen, die ansonsten esoterisch sind (z. B. das Hinzufügen einer Spalte zu den Admin-Post-Tabellen) und das Erstellen einfacher Benutzeroberflächen: Jeder Designer oder Entwickler in unserem Unternehmen kann jeden Standort mit der gleichen Leistung anpassen wie ein professioneller WordPress-Entwickler.