Bei meinem Tagesgeschäft haben wir etwa 1.000 Websites, die auf 30 WordPress Multisite-Installationen verteilt sind. Die Installationen laufen alle mit vielen der gleichen Plugins und Einstellungen, insbesondere auf Netzwerkebene. Dies verursacht eine Menge Zeitverschwendung für unsere Mitarbeiter: Sie müssen manuell die gleichen Einstellungen über 30 Installationen hinweg wiederholen. Aus diesem Grund steigen wir auf etwas um, das ich gerne „Remote Control WordPress“ nenne.
Artikelserie
Teil 1: Die WP REST API zur Fernsteuerung von WordPress (Hier sind Sie!)
Teil 2: OAuth-Spaß mit OAuth1
Teil 3: WordPress fernsteuern im großen Maßstab
Wir bezeichnen eine Installation als „Steuerung“, wo wir Netzwerkeinstellungen konfigurieren, und die anderen 30 „Client“-Installationen beziehen ihre Netzwerkeinstellungen von der Steuerung.
Es wird mehrere Artikel dauern, bis ich das alles dargelegt habe. Ich hoffe, Sie werden jedes mühsame und obskure Detail durchgehen. Diese Methode hat das Potenzial, uns Dutzende von Mannstunden pro Jahr zu ersparen und verringert auch erheblich die Fehleranfälligkeit durch menschliches Versagen. Weniger Klicks bedeuten weniger Fehler! Es ist ein kniffliger und neuer Ansatz, aber ich bin begeistert davon.
Hier ist ein Überblick, bevor wir tiefer einsteigen
- Die Steuerungsinstallation stellt Daten über das WP REST API V2 Plugin bereit.
- Die Steuerungsinstallation führt ein benutzerdefiniertes Plugin aus, um Netzwerkeinstellungen zur WP API hinzuzufügen (standardmäßig sind sie nicht enthalten). Dieses benutzerdefinierte Plugin registriert auch eine globale Variable, die uns eine programmatische Möglichkeit gibt, zwischen der Steuerungsinstallation und den anderen 30 Client-Installationen zu unterscheiden.
- Die Steuerungsinstallation führt das Oauth1-Plugin aus, um die Einstellungen vor öffentlicher Einsicht zu schützen, sie aber unseren skriptgesteuerten Anfragen von den Client-Installationen zugänglich zu machen.
- Sowohl die Steuerungsinstallation als auch unsere 30 Client-Installationen führen viele „Feature“-Plugins aus: benutzerdefinierte Netzwerk-Plugins, die gängige WordPress-Hacks bereitstellen, wie z. B. ein benutzerdefiniertes Logo auf dem wp-login-Bildschirm.
- Sowohl die Steuerungsinstallation als auch unsere 30 Client-Installationen führen ein benutzerdefiniertes Plugin zur Verwaltung von Netzwerkeinstellungen aus. Es bietet eine Abstraktionsschicht, damit unsere Feature-Plugins ihre Einstellungen von der Steuerungsinstallation abrufen können.
Was Sie brauchen, um mitzukommen
- Zwei WordPress Multisite-Installationen: Eine wird die Steuerungsinstallation sein, und die andere wird als Client-Installation dienen. In meinen Beispielen wird die Steuerungsinstallation meine persönliche Website sein, und die Client-Installation wird mein lokales MAMP sein. Zum Zeitpunkt des Schreibens befinden sich beide Installationen auf WordPress 4.5.3. In diesem ersten Artikel benötigen wir nur die Steuerungsinstallation. Nachfolgende Artikel werden die Client-Installation beinhalten.
- Insgesamt fünf Plugins, wie ich oben angedeutet habe. Einige davon sind auf GitHub und einige im .org-Repository. Einige davon sind von mir geschrieben, und einige davon sind von Leuten geschrieben, die viel klüger sind als ich. Einige davon werden wahrscheinlich eines Tages Teil des Kerns sein, und einige davon dienen nur der Demonstration. Ich werde sie behandeln, wenn sie benötigt werden. Dieser erste Artikel erfordert zwei der fünf Plugins.
- Das Theme ist eigentlich egal, aber meine Beispiele werden twentysixteen darstellen. Wenn Sie Probleme haben, mitzukommen, wäre das Nachahmen eine gute Übung.
Sind Sie bis hierhin mit mir? Ich erkenne, dass dies ein schneller Überblick war, aber genau wie am Ende von Mittelschul-Tänzen werden wir es jetzt langsamer angehen. Unser Ziel für den Rest dieses Artikels ist es, Netzwerkeinstellungen auf unserer Steuerungsinstallation über die WP API zugänglich zu machen. Den Rest der Komponenten werden wir in den folgenden Artikeln behandeln. Starten Sie Ihre Testinstallationen und machen Sie mit!
JSON-Rückgaben
Nun, rufen Sie auf Ihrer Steuerungsinstallation http://example.com/wp-json/wp/v2/posts auf. Dies sollte Ihnen einen 404-Fehler zurückgeben.

Installieren und aktivieren Sie nun das WP REST API V2 Plugin im Netzwerk und rufen Sie /wp-json/wp/v2/posts erneut auf. Sie sollten etwas Ähnliches wie das Folgende erhalten

Super! Sie haben jetzt JSON-Daten. Surfen Sie ein wenig herum, nutzen Sie die Endpunkte in der Dokumentation als Leitfaden – oder besser noch, die Link-URLs in der JSON-Antwort selbst. Für weitere Details siehe auch diesen ausgezeichneten Artikel von Andy Adams zum Abrufen von Beiträgen über die API.
Sie bemerken vielleicht in der Dokumentation, dass Netzwerkoptionen nicht zum Abrufen verfügbar sind, aber das werden wir bald beheben. Vorerst laden Sie einfach /wp-json/css_tricks_wp_api_control/v1/ auf Ihrem Steuerungs-Server und beachten Sie den 404. Installieren und aktivieren Sie dann mein CSS Tricks WP API Control Plugin im Netzwerk. Diese URL /wp-json/css_tricks_wp_api_control/v1/ sollte jetzt für Sie funktionieren und einige Daten über die von meinem Plugin registrierte Route network_settings zurückgeben.

Wenn Sie sich sehr anstrengen, werden Sie den interessantesten Teil der Antwort erkennen
"args":{"meta_key":{"required":true}}
Das sagt Ihnen, dass mein Endpunkt ein Argument namens meta_key akzeptiert und dass es erforderlich ist.
Also, /wp-json/css_tricks_wp_api_control/v1/network_settings – was hat es mit dieser URL auf sich? Der Teil /wp-json/ ist für die WP API immer vorhanden. Das bedeutet einfach, dass Sie JSON erhalten. Der Teil /css_tricks_wp_api_control/ ist der Namespace für mein Plugin. Beachten Sie, dass der Kern den Namespace /wp/ verwendet, wie im obigen Beispiel mit den Beiträgen. Die Angabe /v1/ bedeutet, dass dies Version 1 des Endpunkts ist, den mein Plugin verwendet. Ich könnte diese Versionsnummer ändern, wenn ich die Abwärtskompatibilität brechen möchte, aber ansonsten würde ich sie nicht jedes Mal aktualisieren, wenn ich die Versionsnummer meines Plugins selbst aktualisiere. Schließlich habe ich den Endpunkt /network_settings/ zur Abfrage von Netzwerkeinstellungen registriert.
Eintauchen in das Steuerungs-Plugin
Das Steuerungs-Plugin hat zwei Zwecke. Erstens sehen Sie, dass es eine globale Variable registriert, CSS_TRICKS_WP_API CONTROL, die andere Plugins abfragen können, um festzustellen, ob sie auf der Steuerungsinstallation oder einer Client-Installation laufen.
Zweitens sehen Sie, dass es Netzwerkeinstellungen für die Abfrage in der WP API registriert. Diese Datei ist gründlich kommentiert – bitte lesen Sie sie kurz durch. Vorerst werde ich zwei Funktionen hervorheben
callback() ist das, was die Netzwerkeinstellungen aus der Datenbank zurückgibt. Es benötigt eine GET-Variable für meta_key, was uns eine Möglichkeit gibt, eine bestimmte Netzwerkoption abzurufen. Sie können sehen, dass sie erforderlich ist, wenn Sie versuchen, /wp-json/css_tricks_wp_api_control/v1/network_settings zu laden, ohne ?meta_key=irgendwas anzuhängen: Sie erhalten eine 400er-Meldung, die Sie darauf hinweist, dass Sie keinen meta_key angegeben haben.

permission_callback() gibt an, dass wir bei der Abfrage von Daten aus unserer benutzerdefinierten Route eine Authentifizierung bereitstellen müssen, um die Netzwerkeinstellungen in der WP API sehen zu können, sonst hätten wir wahrscheinlich ein Sicherheitsproblem. Dies werden wir im nächsten Artikel über das OAuth1-Plugin tun. Vorerst können Sie sehen, dass die Authentifizierung erforderlich ist, wenn Sie versuchen, /wp-json/css_tricks_wp_api_control/v1/network_settings?meta_key=irgendwas zu laden: In diesem Fall erhalten Sie eine 403er-Meldung, die Sie dafür tadelt, dass Sie sich nicht authentifiziert haben.

Wenn Sie daran interessiert sind, den Endpunkt network_settings ohne Authentifizierung zu erkunden, können Sie den Aufruf von permissions_callback weglassen oder ihn immer TRUE zurückgeben lassen, aber seien Sie vorsichtig, es ist ein Sicherheitsloch.
Diese Datei hätte anders geschrieben werden können. Für einen komplexeren Endpunkt wäre es besser, den WP Rest Controller zu erweitern. Ich denke, das wäre für unseren Fall übertrieben und wäre sicherlich ein Tutorial für sich.
Nächste Schritte
Es gibt ein paar verschiedene Dinge, die Sie sich zu diesem Zeitpunkt fragen sollten.
Eine davon ist die Authentifizierung. Wie sollen die Client-Installationen permission_callback() bestehen? Dies werden wir im nächsten Artikel durch einen langen und brutalen Kampf mit dem OAuth1-Plugin erreichen.
Ein weiterer Punkt ist DRY/WET (Don't Repeat Yourself/Write Everything Twice). Wenn unsere 30 Client-Installationen viele Feature-Plugins ausführen, wäre es dann nicht mühsam, wenn all diese Feature-Plugins eine Abfrage an die Steuerungsinstallation hartkodieren würden? Deshalb werden wir eine Abstraktionsschicht schreiben, die alle unsere Feature-Plugins zum Abfragen des Steuerungsblogs verwenden können. Der Steuerungsblog wird ihn sogar selbst zum Abrufen von Einstellungen verwenden! Kopfzerbrechen; das hebe ich mir für den dritten und letzten Artikel dieser Reihe auf.
Dann gibt es die Leistung. Wir werden jedes Mal eine HTTP-Anfrage stellen, wenn wir eine lächerliche Einstellung benötigen? Nein. Wir werden die Ergebnisse cachen, was ich ebenfalls im dritten Artikel demonstrieren werde.
Allgemeiner könnten Sie auch den Einwand erheben, dass dies nach viel Arbeit klingt. Dem würde ich sagen, im Vergleich wozu? Ich schreibe diese Reihe, weil ich denke, dass es besser ist, als ein Team die gleichen Einstellungen über 30 Installationen hinweg verwalten zu lassen. Ich glaube, am Ende werden Sie vielleicht zustimmen!
Weitere Ressourcen
Wenn Sie bisher Schwierigkeiten haben, mitzukommen, sind hier die besten Anlaufstellen für die nächsten Schritte
- Der Kauf des WROX-Buches über Plugin-Entwicklung ist wie der Kauf einer Karriere.
- Das WP API Buch von Torque. Diese Jungs betreiben WP Engine – muss ich mehr sagen?
- Die WP API Dokumentation, wo der Abschnitt über die Erweiterung der API besonders relevant für das Terrain ist, das wir bisher behandelt haben.
Bereit für mehr?
Wenn Sie bisher folgen, machen Sie sich gefasst auf einen wilden Tanz mit OAuth im nächsten Artikel!
Artikelserie
Teil 1: Die WP REST API zur Fernsteuerung von WordPress (Hier sind Sie!)
Teil 2: OAuth-Spaß mit OAuth1
Teil 3: WordPress fernsteuern im großen Maßstab
In gewisser Weise ist es seltsam, dass dies in irgendeiner Form in WP / WP MS noch nicht behandelt wurde.
Wenn ich das richtig lese/überfliege, wird die Steuerungsinstallation mehr oder weniger zur Abhängigkeit für die Client-Installationen. Abgesehen vom Cache, bedeutet das nicht, dass wenn die Steuerung ausfällt, alle 30 Installationen dann ebenfalls gefährdet sind.
Oder habe ich das falsch verstanden? (Entschuldigung?)
Danke für den Kommentar!
Ich würde sagen, es kommt darauf an, was Sie mit „ausfällt“ meinen. Wenn Sie meinen, dass es vorübergehend nicht verfügbar ist, z. B. ein DDoS-Angriff, gibt es ein paar Möglichkeiten
1) Vielleicht verstecken Sie sich hinter etwas wie CloudFlares „Always Online“-Funktion.
2) Sie haben gut daran getan, Caching zu erwähnen. Später in der Reihe werde ich das Caching der Ergebnisse von der Steuerung demonstrieren, indem ich sie als Transienten auf der Client-Installation speichere. Wenn Sie möchten, könnten Sie dort eine Logik implementieren, um einen Transient auf dem Client nicht zu aktualisieren, wenn die Antwort von der Steuerung 40x/50x/falsy ist.
Guter Artikel – ich freue mich auf den Tag, an dem ich ihn wirklich „brauchen“ werde.
Nur zur Info: „pour“ bedeutet, dass Flüssigkeit überläuft, was Sie meiner Meinung nach von uns erwarten – „pore“ sind Pickel [Natürlich spreche ich nicht für diejenigen jenseits des Teichs, die Dinge mit „e“ tun können, die wir hier alle nicht können]
Ich war mir darüber auch unsicher! Ich schätze Ihre Besorgnis. Ich habe mich dann für den Rat hier entschieden
http://grammarist.com/spelling/pore-over-pour-over/
Was angibt,
Ich freue mich total auf Ihren nächsten Artikel… Ich hatte ein paar „lange und brutale Schlachten“ mit dem OAuth1-Plugin und wurde jedes Mal vernichtend geschlagen…
Ich bin mir nicht sicher, ob ich etwas verpasst habe, aber ist Ihr Anwendungsfall kein gutes Beispiel für die Verwendung von WP-CLI?
Hängt davon ab, wer die Befehle eingibt, schätze ich! Unsere Einstellungs-Manager sind nicht auf einem Qualifikationsniveau oder einem Karriereweg, bei dem die Vorstellung, sie mit Kommandozeilenzugriff auf tausend Live-Domains zu haben, viel Sinn ergibt.
Selbst wenn sie es wären, klingt es, als ob Sie von einem Szenario sprechen, bei dem die Steuerung auf den Client drückt. Ich bin mit einem Szenario, bei dem der Client von der Steuerung abruft, besser vertraut, da es weniger Potenzial gibt, dass ein Fehler die Client-Daten beschädigt.