WP REST API Interna und Anpassung

Im vorigen Teil der Serie haben wir erfahren, wie Sie Inhalte über die WP-REST-API remote erstellen, aktualisieren und löschen. Es ermöglicht uns, plattformunabhängige Anwendungen zu erstellen, die nahtlos mit einem WordPress-basierten Backend arbeiten und dem Benutzer ein reichhaltiges Erlebnis bieten.

Im aktuellen Teil der Serie werden wir die internen Komponenten der WP-REST-API und ihre Zusammenhänge für die API untersuchen. Danach erfahren Sie, wie Sie die Serverantworten für die Standardendpunkte so ändern, dass sie benutzerdefinierte Felder enthalten.

Im aktuellen Artikel werden wir:

  • Lernen Sie die internen Klassen und Methoden der WP REST-API kennen
  • Ändern Sie die Serverantwort für Standardendpunkte
  • Erfahren Sie, wie Sie benutzerdefinierte Felder editierbar machen

Beginnen wir mit einem Blick auf die Interna der WP REST-API.

Interne Klassen und Methoden der WP-REST-API

Klassen in der WP REST-API können in die folgenden zwei Kategorien unterteilt werden:

  1. Infrastrukturklassen: Dies sind die grundlegenden Klassen, die für das Zusammenhalten der API verantwortlich sind. Sie führen keine Datentransformation durch.
  2. Endpunktklassen: Diese Klassen sind dafür verantwortlich, CRUD-Vorgänge für Ressourcen wie Beiträge, Seiten, Benutzer, Kommentare usw. auszuführen.

Schauen wir uns die einzelnen Klassen der beiden oben genannten Kategorien an.

Infrastrukturklassen

Die drei Infrastrukturklassen, die zusammen die REST-API unterstützen, lauten wie folgt:

  1. WP_REST_Server
  2. WP_REST_Request
  3. WP_REST_Response

WP_REST_Server

Dies ist die Kernklasse der WP-REST-API, die den REST-Server durch Registrieren von Routen, Bereitstellen von Anforderungen und Erstellen von Antworten implementiert. Es formatiert die Daten, die an den Client übergeben werden sollen, und bereitet den Fehler im Fehlerfall auf, indem der Fehlercode und der Nachrichtentext hinzugefügt werden. Es prüft auch die Authentifizierung.

Wir haben sehr viel mit dem gearbeitet / wp-json Indexendpunkt zum Überprüfen aller Funktionen und unterstützten Routen für eine Site. Die Methode get_index (), Die für das Abrufen des Site-Indexes zuständig ist, befindet sich ebenfalls in dieser Klasse.

Um Anfragen zu bearbeiten und Antworten vorzubereiten, die WP_REST_Server Klasse verwendet die WP_REST_Request und WP_REST_Response bzw. Klassen.

WP_REST_Request

Das WP_REST_Request Klasse implementiert das Anforderungsobjekt für die WP-REST-API. Es enthält Daten aus der Anfrage wie Header und Request-Body und wird von der Callback-Funktion übergeben WP_REST_Server Klasse. Sie überprüft auch, ob die Parameter, die an die Anforderung übergeben werden, gültig sind, und führt bei Bedarf eine Datenbereinigung durch.

WP_REST_Response

Das WP_REST_Response Wie der Name schon sagt, implementiert class das Antwortobjekt. Es enthält notwendige Daten wie Antwortstatuscode und Antworttext.

Betrachten wir nun die Endpunktklassen.

Endpunktklassen

Die Endpunktklassen in der WP-REST-API sind für die Durchführung von CRUD-Vorgängen verantwortlich. Diese Klassen umfassen WP_REST_Posts_Controller, WP_REST_Taxonomies_ControllerWP_REST_Users_Controller, usw. Alle diese Endpunktklassen erweitern eine einzige abstrakte Klasse WP_REST_Controller Dies liefert ein konsistentes Muster zum Ändern von Daten.

Das WP_REST_Controller Klasse enthält Methoden wie get_item (), create_item (), update_item ()Element löschen(), usw., um CRUD-Operationen durchzuführen. Diese Methoden müssen von Unterklassen überschrieben werden, indem sie ihre eigene Abstraktion zum Abrufen, Erstellen, Aktualisieren und Ändern von Daten implementieren.

Weitere Informationen zu diesen Klassen und ihren internen Methoden finden Sie in der offiziellen Dokumentation.

Nachdem wir die internen Klassen der WP-REST-API kennengelernt haben, wollen wir uns ansehen, wie wir Serverantworten für Standardendpunkte so ändern können, dass sie benutzerdefinierte Felder enthalten.

Serverantworten ändern

Im vorherigen Abschnitt haben wir uns die internen Klassen und Methoden angesehen, auf denen die API basiert. Zusammen bilden diese Klassen und Methoden die API als Ganzes und bieten Entwicklern die Möglichkeit, die API zur Berücksichtigung verschiedener Szenarien und Anwendungsfälle zu erweitern.

Die WP-REST-API macht Daten auf vorhersagbare Weise verfügbar. Dazu gehören verschiedene Ressourcen wie Posts, Post-Meta, Seiten und Benutzer sowie deren Standardeigenschaften. Diese Daten können jedoch nicht immer den Anforderungen der einzelnen WordPress-Sites oder -Benutzer entsprechen. Daher bietet die WP-REST-API eine Möglichkeit zum Ändern der Daten, die der Server für jede der Standardrouten zurückgibt.

Das register_rest_field () Diese Methode bietet die Möglichkeit, Felder in der Antwort für ein Objekt hinzuzufügen oder zu aktualisieren. Das Ändern eines Felds aus einer Antwort wird jedoch nie von der API empfohlen, da dies zu Kompatibilitätsproblemen für Clients führen kann, die eine Standardantwort des Servers erwarten. Wenn Sie also ein Feld ändern müssen, sollten Sie das Feld mit dem gewünschten Wert duplizieren.

Ebenso wird vom Löschen eines Standardfelds dringend abgeraten, da ein Client dies möglicherweise erwartet. Wenn Sie eine kleinere Teilmenge der vom Server zurückgegebenen Antwort benötigen, sollten Sie zusätzlich zu den Standardkontexten (z. B.) weitere Kontexte erstellen Aussicht oder bearbeiten.

Wir können jedoch der Antwort, die der Server für ein oder mehrere Objekte zurückgibt, ein Feld hinzufügen. Diese Felder können jeden Wert enthalten, der von Post oder User-Meta bis zu einem beliebigen anderen Wert reicht.

Im nächsten Abschnitt arbeiten wir mit der register_rest_field () Methode, um der vom Server zurückgegebenen Antwort benutzerdefinierte Felder hinzuzufügen Post Objekt.

Mit dem arbeiten register_rest_field () Methode

Wie bereits erwähnt, die register_rest_field () Diese Methode kann zum Hinzufügen oder Aktualisieren von Feldern in der vom Server zurückgegebenen Antwort verwendet werden. Diese Methode akzeptiert drei Argumente:

  1. $ object_type
  2. $ Attribut
  3. $ args

Das $ object_type Das Argument kann entweder ein String oder ein Array sein, das die Namen aller Objekte enthält, für die das Feld hinzugefügt werden soll. Diese Objekte können sein Post, Begriff, KommentarNutzer, usw. Wenn wir einem benutzerdefinierten Beitragstyp ein benutzerdefiniertes Feld hinzufügen müssen, dann die $ object_type Argument wäre der Name des Beitragstyps.

Das $ Attribut Argument ist der Name des benutzerdefinierten Feldes. Dieser Name erscheint zusammen mit seinem Wert in der Serverantwort als Schlüssel.

Das $ args Array ist ein assoziatives Array, das die folgenden drei Schlüssel enthalten kann:

  1. $ get_callback
  2. $ update_callback
  3. $ Schema

Die Werte der ersten beiden Schlüssel sind die Namen der Methoden, mit denen der Wert des benutzerdefinierten Felds abgerufen oder aktualisiert wird. Das Letzte $ Schema key definiert die Methode oder die Variable, mit der das Schema für das benutzerdefinierte Feld definiert wird.

Alle oben genannten Schlüssel sind optional. Wenn sie jedoch nicht hinzugefügt werden, wird die Funktion nicht hinzugefügt. Zum Beispiel, wenn Sie das definieren $ get_callback Schlüssel aber nicht der $ update_callback Wenn Sie diese Taste drücken, wird die Abruffunktion hinzugefügt, aber die Aktualisierungsfunktion wird nicht hinzugefügt. Wenn Sie das weglassen $ get_callback Schlüssel wird das Feld überhaupt nicht zur Antwort hinzugefügt.

Das register_rest_field () Methode funktioniert durch Ändern der $ wp_rest_additional_fields Variable. Diese Array-Variable enthält registrierte Felder nach Objekttypen, die vom Server in der Antwort zurückgegeben werden. Immer wenn ein Feld von registriert wird register_rest_field () Methode wird es hinzugefügt $ wp_rest_additional_fields Variable. Ändern Sie jedoch die $ wp_rest_additional_fields Variable manuell wird dringend davon abgeraten.

Hinzufügen benutzerdefinierter Felder zur Antwort

Wir haben uns mit dem vertraut gemacht register_rest_field () Methode können wir nun die Antwort für die ändern Post Objekt. Ein typischer Anwendungsfall wäre hier das Hinzufügen eines Autoren-Anzeigenamensfelds, das normalerweise erforderlich ist, wenn Beiträge auf einer Indexseite aufgelistet werden. Da die Standardantwort dieses Feld nicht enthält, können wir das verwenden register_rest_field () Methode, um es in die Antwort aufzunehmen.

Wir beginnen mit der Erstellung eines einfachen Plugins. Erstellen Sie also einen neuen Ordner mit dem Namen Restantwort-Modifizierer in deiner / wp-content / plugins Verzeichnis. Erstellen Sie eine leere index.php Datei und fügen Sie in die folgende Plugin-Definition ein:

Das register_rest_field () Methode sollte in der registriert werden rest_api_init Aktion. Daher erstellen wir eine Funktion mit dem Namen bs_add_custom_rest_fields () und binde es an die rest_api_init Haken:

Beachten Sie, dass die öffnenden PHP-Tags sind hier nicht erforderlich, aber ich habe sie hinzugefügt, damit die Syntax richtig hervorgehoben wird.

In der bs_add_custom_rest_fields () Funktion können wir die verwenden register_rest_field () Methode, um ein Feld für den Autorennamen aufzunehmen:

Funktion bs_add_custom_rest_fields () // Schema für das Feld "bs_author_name" $ ​​bs_author_name_schema = array ('description' => 'Name des Postautors'), 'type' => 'string', 'context' => array ('view') ); // Registrieren des Felds bs_author_name register_rest_field ('post', 'bs_author_name', array ('get_callback' => 'bs_get_author_name'), 'update_callback' => null, 'schema' => $ bs_author_name_schema); 

Wie im vorherigen Abschnitt erwähnt, ist das erste Argument in der register_rest_field () method ist der Name des Objekts, für das wir die Antwort ändern. Da müssen wir die Antwort für das ändern Post Objekt übergeben wir dasselbe wie das erste Argument.

Das zweite Argument im obigen Code ist der Name des Felds, das in der Antwort angezeigt wird. Es ist immer ratsam, den Namen eines benutzerdefinierten Felds in der Antwort voranzustellen, um eine maximale Vorwärtskompatibilität zu gewährleisten und es in Zukunft nicht durch andere Plugins überschrieben zu werden. Daher gehen wir weiter bs_author_name im zweiten Argument als $ Attribut des benutzerdefinierten Feldes.

Das dritte und letzte Argument im obigen Code ist ein Array für Callback-Methoden und das Schema. Dieses Array enthält den Namen der Rückmeldemethoden für das Abrufen und Aktualisieren des benutzerdefinierten Felds in $ get_callback und $ update_callback Tasten jeweils. Wir passieren die bs_get_author_name Funktion als Rückruf-Callback-Methode. Wir werden diese Funktion in Kürze definieren.

Für die $ update_callback Schlüssel, wir passieren Null da dies ein schreibgeschütztes Feld ist und wir den Autorennamen für einen Beitrag nicht aktualisieren müssen.

Für die $ Schema Schlüssel übergeben wir ein Array namens $ bs_author_name_schema. Dieses Array enthält verschiedene Eigenschaften für das Feld wie den Datentyp, den Kontext und die Beschreibung.

Das einzige, was wir jetzt definieren müssen, ist das bs_get_author_name () Funktion, die als. fungiert $ get_callback Methode für unser benutzerdefiniertes Feld. Unten ist der Code für diese Funktion:

/ ** * Rückruf zum Abrufen des Autorennamens * @param array $ object Das aktuelle Beitragsobjekt * @param string $ field_name Der Name des Feldes * @param WP_REST_request $ request Die aktuelle Anfrage * @return string Der Name des Autors * / Funktion bs_get_author_name ($ object, $ field_name, $ request) return get_the_author_meta ('display_name', $ object ['author']); 

Das $ get_callback Methode erhält drei Argumente für Folgendes:

  1. $ object: Das aktuelle Objekt In unserem Fall ist es der aktuelle Post.
  2. $ Feldname: Der Name des benutzerdefinierten Feldes, das hinzugefügt wird.
  3. $ anfrage: Das Anforderungsobjekt.

Wir benutzen die $ Autor Eigentum der $ object Argument, das die ID des Postautors enthält. Und mit dem get_the_author_meta () Bei dieser Funktion rufen wir den Anzeigenamen des Autors für den aktuellen Beitrag ab und geben ihn zurück.

Nun, da das Feld registriert ist, können wir eine senden ERHALTEN Anfrage an die / wp / v2 / Beiträge Route, um zu sehen, ob es richtig funktioniert:

Hier ist die Antwort in Postman:

Dieses neu registrierte benutzerdefinierte Feld wird zusammen mit seinem Schema auch in der Serverantwort angezeigt, wenn wir ein senden OPTIONEN Anfrage an die / wp / v2 / Beiträge Route:

Daher wurde ein benutzerdefiniertes Feld für die Name des Autorennamens erfolgreich registriert. Dieses Feld ist jedoch schreibgeschützt, da wir es nicht durch Senden von a aktualisieren können POST anfordern. Im folgenden Abschnitt registrieren wir ein editierbares Feld für die Anzahl der Post-Views.

Registrieren eines bearbeitbaren Feldes

Jetzt registrieren wir ein benutzerdefiniertes Feld für die Anzahl der Post-Views. Wir werden uns nur mit der eigentlichen Registrierung des Feldes mit der WP REST-API befassen, wobei die Implementierung zum Erhöhen der Zählnummer weggelassen wird.

Unten ist der Code für bs_post_views Benutzerdefinierte Feldregistrierung zusammen mit ihrem Schema:

// Schema für das Feld "bs_post_views" $ bs_post_views_schema = array ('description' => 'Anzahl der Ansichten zählen', 'type' => 'integer', 'context' => array ('view', 'edit')); // Registrieren des Felds bs_post_views register_rest_field ('post', 'bs_post_views', array ('get_callback' => 'bs_get_post_views', 'update_callback' => 'bs_update_post_views', 'schema')> $ bs_post_views_schema;

Der Code ähnelt dem Code, den wir im vorherigen Abschnitt geschrieben haben, mit der Ausnahme, dass er jetzt eine Callback-Methode enthält bs_update_post_views für die $ update_callback Schlüssel. Diese Funktion ist für die Aktualisierung des Feldwerts verantwortlich.

Das $ context Eigentum in der $ bs_post_views_schema Schema-Array enthält zwei Werte für Aussicht und bearbeiten. Aufnahme des Bearbeitungswertes in das $ context Argument sorgt dafür, dass die bs_post_views Das Feld wird in der Serverantwort zurückgegeben, nachdem es aktualisiert wurde.

Die Methoden zum Abrufen und Aktualisieren von Rückrufen lauten wie folgt:

/ ** * Rückruf zum Abrufen von Post Views count * @param array $ object Das aktuelle Postobjekt * @param string $ field_name Der Name des Feldes * @param WP_REST_request $ request Die aktuelle Anfrage * @return integer Post views count * / function bs_get_post_views ($ object, $ field_name, $ request) return (int) get_post_meta ($ object ['id'], $ field_name, true);  / ** * Rückruf zur Aktualisierung der Anzahl der Post Views * @param mixed $ value Anzahl der Post Views * @param object $ object Das Objekt aus der Antwort * @param string $ Feldname Name des aktuellen Feldes * @return bool | int * / Funktion bs_update_post_views ($ value, $ object, $ field_name) if (! $ value ||! is_numeric ($ value)) return;  Rückgabe update_post_meta ($ object-> ID, $ field_name, (int) $ value); 

Der Code ist ziemlich einfach, da er das verwendet get_post_meta () und update_post_meta () Methoden zum Abrufen und Aktualisieren der Werte.

Das bs_get_post_views () Die Methode ruft zuerst den Meta-Wert für die bs_post_views meta key und wandelt es in eine ganze Zahl um, bevor es zurückgegeben wird.

Die Callback-Methode wurde übergeben $ update_callback erhält drei Argumente für Folgendes:

  1. $ wert: Der neue Wert für das Feld.
  2. $ object: Aktuelles Objekt aus der Antwort.
  3. $ Feldname: Der Name des Felds, das aktualisiert wird.

In dem bs_update_post_views () Als erstes prüfen wir, ob der übergebene Wert nicht leer ist und ein numerischer Wert ist. Wenn nicht, kehren wir ohne etwas zurück.

Wenn der Wert numerisch ist, übergeben wir ihn an update_post_meta () Funktion, die es in der Datenbank speichert, nachdem der Typ in eine gültige Ganzzahl umgewandelt wurde.

Nachdem Sie das Feld erfolgreich registriert haben, testen Sie es, indem Sie a senden ERHALTEN anfordern:

$ GET / wp / v2 / posts

Nachfolgend finden Sie eine Beispielantwort für die obige Anfrage:

Wie wir im obigen Bild sehen können, ist der aktuelle Wert von bs_post_views Feld ist 0 für einen bestimmten Beitrag. Das liegt daran, dass die get_post_meta () Die Methode gibt eine leere Zeichenfolge zurück, da kein Metawert für die gefunden wurde bs_post_views Metaschlüssel und Typumwandlung einer leeren Zeichenfolge in eine Ganzzahl in PHP führt zu 0.

Wir können das aktualisieren bs_post_views Feld durch Senden eines POST Anfrage an die / wp / v2 / posts / Endpunkt. Der JSON-Body für die Anforderung lautet wie folgt:

"bs_post_views": 4050

Wenn die Anforderung erfolgreich ist, gibt der Server a zurück 200 - OK Statuscode zusammen mit dem aktualisierten Post-Objekt, das auch das enthält bs_post_views Feld:

Das bs_post_views Das benutzerdefinierte Feld wird jetzt aktualisiert.

Beachten Sie, dass wir zusammen mit der Anforderung einen JSON-Body gesendet haben, um das Feld zu aktualisieren. Der JSON-Body enthielt den Feldnamen-bs_post_views-mit einem ganzzahligen Wert von 4050. Wenn wir versuchen, einen nicht numerischen Wert zu senden, sagen wir "Abc1234", Das Feld wird nicht aktualisiert, da wir eine Bedingung für einen numerischen Wert in der bs_update_post_views () Rückrufmethode.

Unten ist der vollständige Quellcode für das Plugin:

 'Name des Postautors', 'type' => 'string', 'context' => array ('view')); // Registrieren des Felds bs_author_name register_rest_field ('post', 'bs_author_name', array ('get_callback' => 'bs_get_author_name'), 'update_callback' => null, 'schema' => $ bs_author_name_schema); // Schema für das Feld "bs_post_views" $ bs_post_views_schema = array ('description' => 'Anzahl der Ansichten zählen', 'type' => 'integer', 'context' => array ('view', 'edit')); // Registrieren des Felds bs_post_views register_rest_field ('post', 'bs_post_views', array ('get_callback' => 'bs_get_post_views', 'update_callback' => 'bs_update_post_views', 'schema')> $ bs_post_views_schema;  / ** * Rückruf zum Abrufen des Autorennamens * @param array $ object Das aktuelle Beitragsobjekt * @param string $ field_name Der Name des Feldes * @param WP_REST_request $ request Die aktuelle Anfrage * @return string Der Name des Autors * / function bs_get_author_name ($ object, $ field_name, $ request) return get_the_author_meta ('display_name', $ object ['author']);  / ** * Rückruf zum Abrufen der Anzahl der Post Views * @param array $ object Das aktuelle Post-Objekt * @param string $ field_name Der Name des Feldes * @param WP_REST_request $ request Die aktuelle Anfrage * @return integer Post views count * / Funktion bs_get_post_views ($ object, $ field_name, $ request) return (int) get_post_meta ($ object ['id'], $ field_name, true);  / ** * Rückruf zur Aktualisierung der Anzahl der Post Views * @param mixed $ value Anzahl der Post Views * @param object $ object Das Objekt aus der Antwort * @param string $ Feldname Name des aktuellen Feldes * @return bool | int * / Funktion bs_update_post_views ($ value, $ object, $ field_name) if (! $ value ||! is_numeric ($ value)) return;  Rückgabe update_post_meta ($ object-> ID, $ field_name, (int) $ value); 

Hiermit können Sie die Serverantworten für die Standard-API-Endpunkte ändern. Wir haben die Oberfläche für die Änderung der REST-API kaum zerkratzt, da sie weitaus mehr Flexibilität bietet als nur das Ändern der Serverantworten. Dazu gehört das Hinzufügen von Unterstützung für den benutzerdefinierten Inhaltstyp über benutzerdefinierte Controller und Namespaces sowie das Registrieren von benutzerdefinierten Routen zum Offenlegen und Ändern von Daten. Wir werden versuchen, diese fortgeschrittenen Themen in zukünftigen Artikeln zu behandeln.

Nur der Anfang…

Hier beenden wir unseren Weg, uns mit der WP REST API vertraut zu machen. In dieser Serie haben wir ziemlich grundlegende Konzepte wie Authentifizierungsmethoden und das Abrufen, Erstellen und Aktualisieren von Daten behandelt. In diesem letzten Teil der Serie haben wir uns kurz die internen Klassen der WP-REST-API angesehen und dann gelernt, Serverantworten für die Standardendpunkte zu ändern.

Es war nie der Zweck dieser Serie, jeden Aspekt der WP REST-API abzudecken - tatsächlich kann dies niemals in einer einzigen Serie erreicht werden. Der Zweck dieser Serie bestand jedoch darin, Sie mit dieser neuen, fantastischen Ergänzung zum Laufen zu bringen und Sie zu ermutigen, selbst herumzuspielen und zu experimentieren. Ich hoffe, dass Sie gefunden haben, dass diese Serie ihr Endziel erfüllt.