it-swarm.com.de

Aktualisieren Sie die CPT-Metadaten mit REST API

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

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

Diese Methode basiert auf einer Problemumgehung, die hier zu finden ist: WPREST API "rest_no_route" beim Versuch, Meta zu aktualisieren

Ich kann die Metadaten auch mithilfe eines Posts 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 Array von Daten. Wenn ich versuche, ein Feld mit der zweiten Methode (JSON-Body) zu aktualisieren, erhalte ich den folgenden Fehler:

{"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 (so wird es in MySql gespeichert).

Wenn ich sende:

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

Ich bekomme:

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

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

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

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

Mein Endziel hier ist es, neue Daten in die MySQL-Datenbank für dieses benutzerdefinierte Feld einzufügen. Ich erfahre, dass die WP REST -API immer noch sehr undokumentiert und in Bezug auf Metadaten eher schwach ist, insbesondere (1) für benutzerdefinierte Beitragstypen und (2) für nicht -string/numerische Datentypen.

Ich denke darüber nach, eine einfache PHP Seite zu schreiben, die eine Produkt-ID enthält, den richtigen Metadatensatz mithilfe einer WordPress-Funktion findet und die Daten aktualisiert, indem JSON in ein serialisiertes Array umgewandelt wird Ich kenne PHP, um dies zu tun, und ich muss auch einige Sicherheitsaspekte berücksichtigen. Gibt es Beispiele oder Ideen, wie Sie damit beginnen können, oder gibt es eine bessere Möglichkeit, um meine Metadaten zu aktualisieren?

6
Chet at C2IT

Sind Sie sich in den ersten Ausgaben sicher, dass das Plugin die Felder registriert, die der API zur Verfügung gestellt werden sollen? der register_meta muss show_in_rest => true zugewiesen werden.

Außerdem benötigt der CPT custom-fields in seinem unterstützten Array 'supports' => array('title','editor','thumbnail','custom-fields'), damit er beim Zugriff auf den API-Endpunkt des CPT verfügbar ist.

Ich beschreibe dies (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 sie möglicherweise hinzufügen oder sogar die Funktionen insgesamt überschreiben. Nur ein Gedanke.

Ich denke darüber nach, eine einfache PHP Seite zu schreiben, die eine Produkt-ID enthält, den richtigen Metadatensatz mithilfe einer WordPress-Funktion findet und die Daten aktualisiert, indem JSON in ein serialisiertes Array umgewandelt wird vertraut genug mit PHP, um dies zu tun

Schauen Sie dazu in json_decode und json_encode. Sie können das Argument assoc mit json_decode auf true setzen und statt eines Objekts ein Array abrufen.

Eine (ungetestete) schnelle Beispielfunktion zum Abrufen von 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'];
    } 

}

Gibt es Beispiele oder Ideen, wie Sie damit beginnen können, oder gibt es eine bessere Möglichkeit, um meine Metadaten zu aktualisieren?

Eine benutzerdefinierte Route und ein benutzerdefinierter Endpunkt sind möglicherweise die effektivste Methode, um dies zu tun (vorausgesetzt, es ist nicht nur das Plugin, das diese Elemente nicht für die API verfügbar gemacht hat, wie oben erwähnt). Sie müssen weiterhin Nonce-Prüfungen und andere mögliche Authentifizierungen berücksichtigen, je nachdem, wie Sie die Endpunkte verwenden. Routen und Endpunkte und Benutzerdefinierte Endpunkte suchen Sie in der API-Dokumentation; wahrscheinlich Controller-Klassen auch.

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

4
hwl