(Private) Metadaten in der REST API
2016
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 auftrue
wird das Metafeld an die API übergeben.type
gibt den Typen an. Also beispielsweise, ob es sich um einenstring
oder um eineninteger
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 vonregister_meta()
bekannten Authentifizierungs Callback.sanitize_callback
enthält den bereits aus der ursprünglichen Version vonregister_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 demsingle
-Boolean inget_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:
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, )); });