Aktualisieren Sie CPT-Metadaten mithilfe der REST-API

Ich versuche, die Metadaten eines CPT-Posts mithilfe der REST-API zu aktualisieren. Ich kann ein numerisches Metadatenelement mit einem solchen POST aktualisieren:

example.com/wp-json/wp/v2/posts/73/meta/229?value=2

Diese Methode basiert auf einer Problemumgehung, die hier gefunden wird: WP REST API “rest_no_route” beim Versuch, Meta zu aktualisieren

Ich kann die Metadaten auch mit einem Post hier aktualisieren: example.com/wp-json/wp/v2/posts/73/meta/229

mit diesem JSON im Körper:

{"value":"2"} 

Das Feld, das ich aktualisieren muss, enthält jedoch ein serialisiertes Datenfeld. Wenn ich versuche, das Feld mit der zweiten Methode (JSON-Rumpf) zu aktualisieren, erhalte ich folgende Fehlermeldung:

 {"value": [ { "name": "Related Documents", "default": true, "documents": [ { "label": "RFA - Revit File", "file_location": "http://example.com/wp-content/uploads/2017/03/file.pdf" } ] } ] } 

Ich habe auch versucht, meine Daten als serialisiertes Array zu senden (wie es in MySql gespeichert wird).

Wenn ich sende:

 {"value": "{a:0}"} 

Ich bekomme:

 { "code": "rest_post_invalid_action", "message": "Invalid existing meta data for action.", "data": { "status": 400 } } 

Hinweise: Diese Metadaten sind ein Feld, das Teil eines WooCommerce-Plugins ist: https://www.ocommerce.com/products/product-documents/

Ich habe dieses Plugin installiert, um meine benutzerdefinierten Post-Typen der API zugänglich zu machen (und ich kann die Daten erneut abrufen): wordpress.org/plugins/wp-rest-api-controller/

Ich habe auch dieses Plugin installiert, um den Zugang zu den Meta-Endpunkten zu ermöglichen: wordpress.org/plugins/rest-api-meta-endpoints/

Mein Endziel ist hier, neue Daten in die MySql-database für dieses benutzerdefinierte Feld zu stopfen. Ich lerne, dass die WP-REST-API immer noch sehr undokumentiert und ziemlich schwach ist, wenn es um Metadaten geht, insbesondere (1) für benutzerdefinierte Post-Typen und (2) für nicht-string / numerische Datentypen.

Ich überlege, eine einfache PHP-Seite zu schreiben, die eine Produkt-ID annimmt, den richtigen Meta-Eintrag mit einer WordPress-function findet und die Daten aktualisiert, indem ich geposteten JSON in ein serialisiertes Array umwandle, aber ich bin nicht vertraut genug mit PHP Dies und ich müsste auch einige Sicherheitsaspekte berücksichtigen. Irgendwelche Beispiele oder Ideen, wie man dies startet, oder ob es einen besseren Weg gibt, meine Metadaten zu aktualisieren?

Solutions Collecting From Web of "Aktualisieren Sie CPT-Metadaten mithilfe der REST-API"

Sind Sie bei den anfänglichen Problemen davon überzeugt, dass das Plugin die Felder registriert, die der API zur Verfügung gestellt werden sollen? Die register_meta benötigt show_in_rest => true zugewiesen.

Außerdem benötigt der CPT custom-fields in seinem Unterstützungs-Array, 'supports' => array('title','editor','thumbnail','custom-fields') , die beim Zugriff auf den CPT-API-Endpunkt verfügbar gemacht werden.

Ich beziehe das (mit Links usw.) in dieser Antwort auf eine andere Frage: https://wordpress.stackexchange.com/a/266277/118366

Wenn einer dieser Werte fehlt, können Sie möglicherweise einhängen, um sie hinzuzufügen oder sogar die functionen insgesamt zu überschreiben. Nur ein Gedanke.

Ich überlege, eine einfache PHP-Seite zu schreiben, die eine Produkt-ID annimmt, den richtigen Meta-Eintrag mit einer WordPress-function findet und die Daten aktualisiert, indem ich geposteten JSON in ein serialisiertes Array umwandle, aber ich bin nicht vertraut genug mit PHP Dies

Schauen Sie hierzu in json_decode und json_encode nach. Sie können das assoc-Argument mit json_decode auf true setzen und ein Array anstelle eines Objekts erhalten.

Eine (nicht getestete) schnelle Beispielfunktion zum Abrufen eines bestimmten JSON und zum Setzen der dekodierten Ergebnisse in eine Variable:

 $json = file_get_contents('PATH/TO/FILE.json'); function the_json_contents($json_to_get){ $json_in_array = json_decode($json_to_get, true); //json string to array return $json_in_array; } function do_stuff_do_json() { $json_array = the_json_contents($json); foreach($json_array['id'] as $js) { //assuming we have an 'id' key $somevariable = $js['someKey']; $somevariable2 = $js['someOtherKey']; } } 

Irgendwelche Beispiele oder Ideen, wie man dies startet, oder ob es einen besseren Weg gibt, meine Metadaten zu aktualisieren?

Eine benutzerdefinierte Route und ein Endpunkt können die effektivste Möglichkeit sein, dies zu tun (vorausgesetzt, es ist nicht nur das Plugin, das diese Elemente nicht der API aussetzt, wie oben erwähnt). Sie müssen immer noch Nonce-Prüfungen und andere mögliche Authentifizierungen berücksichtigen, je nachdem, wie Sie die Endpunkte verwenden. In der api-Dokumentation suchen Sie nach Routen und Endpunkten und nach benutzerdefinierten Endpunkten . wahrscheinlich auch Controller-classn .

Wieder würde ich das Plugin überprüfen, um zu sehen, ob es die Meta-Felder registriert für die API wie eingangs erwähnt hat.