Websupporter

Vor allem über WordPress.

(Private) Metadaten in der REST API

Ich hatte ja schon vor einiger Zeit einen Beitrag verfasst, dass im Zuge der REST API die Funktion register_meta() neue Bedeutung erlangt. Mittlerweile hat sich einiges getan. Nicht nur, dass die API mit 4.7 in den Core kommen soll 🎉: Die WordPress REST API kann nun auch Metadaten ausgeben und authentifizierte Nutzer können Metadaten ändern.

Sagen wir, das Postmetafeld foo soll über die API zugänglich gemacht werden. Dazu muss man foo nun zunächst über register_meta() registrieren. Im ersten Parameter übergibt man, um welchen Typen von Metadatum es sich handelt: Für Metadaten, welche an Seiten oder Beiträge angehängt werden, übergibt man post. Für Usermetadaten user und für Termmetadaten term. Der zweite Parameter enthält die Bezeichnung des Datums, in unserem Fall wäre dies foo und schließlich übergibt man einen Argumentenarray:

  • show_in_rest
    ist ein Boolean. Setzt man ihn auf true wird das Metafeld an die API übergeben.
  • type
    gibt den Typen an. Also beispielsweise, ob es sich um einen string oder um einen integer handelt.
  • description
    dient dazu, eine Beschreibung zu hinterlegen, welche das Feld beschreibt und auch über die API ausgegeben wird.
  • auth_callback
    enthält den bereits aus der ursprünglichen Version von register_meta() bekannten Authentifizierungs Callback.
  • sanitize_callback
    enthält den bereits aus der ursprünglichen Version von register_meta() bekannten Reinigungs Callback, welcher aufgerufen wird, um das Datum vor dem Speichern zu reinigen.
  • single
    gibt an, ob dieses Datum nur ein einziges Mal gespeichert werden kann, oder ob es mehrere Einträge unter dem selben Schlüssel geben kann. Dies entspricht dem single-Boolean in get_post_meta().

Um nun foo über die API bereitzustellen, genügt es schon, den Schlüssel wie folgt zu registrieren:

register_meta( 'post', 'foo', array(
	'show_in_rest' => true,
));

Die Ausgabe in der API sähe dann wie folgt aus:

Ein Metafeld in der Rest API Ausgabe
Ein Metafeld in der Rest API Ausgabe

Da wir das Feld nicht als single ausgewiesen haben, wird es als Array ausgegeben. mit single true würde nur der String zurückgegeben.

Mehr Informationen zur REST API und zu spezifischen Befehlen der REST API finden sich auf wp-api.org.

Private Metafelder

In unserem Gespräch über die REST API auf dem WP Sofa hatte Felix Arntz die Frage aufgeworfen, ob es möglich wäre, Metafelder auch so zu registrieren, dass nur authentifizierte Nutzer die Möglichkeit hätten, diese einzusehen. Man denke beispielsweise an eine App, welche einen Blick auf den tagesaktuellen Umsatz von Produkten wirft. Das wären keine Daten, die man öffentlich zugänglich machen wollte.

register_meta() bietet von sich aus dazu zunächst keine Optionen an, weshalb ich das im Gespräch zunächst verneinte. Doch es wäre ja tatsächlich eine interessante Erweiterung und etwas Schade, wenn das nicht ginge. Heute hatte ich etwas Gelegenheit noch einmal darüber nachzudenken und kam zu dem Schluss, dass register_meta() eine solche Unterscheidung auch gar nicht braucht, weil wir diese während des Registrierungsprozesses selbstverständlich selber treffen können.

Was ich meine: Ein authentifizierter Aufruf in der API ist letztlich ein eingeloggter Benutzer und sämtliche Funktionen wie current_user_can() funktionieren.

Wenn wir also bestimmte Felder über die API nur bestimmten Nutzern zugänglich machen wollen, so können wir dies schon jetzt aufgrund der Art und Weise, wie ein authentifizierter Aufruf in WordPress funktioniert:

add_action( 'rest_api_init', function() {
	if ( ! current_user_can( 'edit_posts' ) ) {
		return;
	}

	register_meta( 'post', 'foo', array(
		'show_in_rest' => true,
	));
});

Über den Autoren

Seine erste Webseite hat David Remer 1998 in HTML verfasst. Wenig später war er fasziniert von DHTML und JavaScript. Nach jahrelanger Freelancerei arbeitete er zunächst für Inpsyde und ist heute Entwickler bei Automattic. Außerdem hat er das Buch "WordPress für Entwickler" verfasst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.