web-dev-qa-db-fra.com

Mettre à jour les métadonnées du CPT en utilisant REST API

J'essaie de mettre à jour les métadonnées d'une publication CPT à l'aide de l'API REST. Je peux mettre à jour un élément de métadonnée numérique à l'aide d'un POST tel que:

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

Cette méthode est basée sur une solution de contournement trouvée ici: WP REST API "rest_no_route" lors de la tentative de mise à jour de méta

Je peux également mettre à jour les métadonnées en utilisant un post ici: example.com/wp-json/wp/v2/posts/73/meta/229

avec ce JSON dans le corps:

{"value":"2"}

Le champ que j’ai besoin de mettre à jour contient cependant un tableau de données sérialisé. Lorsque j'essaie de mettre à jour un champ à l'aide de la deuxième méthode (corps JSON), j'obtiens cette erreur:

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

J'ai également essayé d'envoyer mes données sous forme de tableau sérialisé (c'est comment il est stocké dans MySql).

Quand j'envoie:

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

Je reçois:

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

Remarques: Cette métadonnée est un champ faisant partie d’un plug-in WooCommerce: https://woocommerce.com/products/product-documents/

J'ai ce plugin installé pour exposer mes types de publication personnalisés à l'API (et je suis capable de récupérer les données): wordpress.org/plugins/wp-rest-api-controller/

J'ai également installé ce plugin pour permettre l'accès aux méta extrémités: wordpress.org/plugins/rest-api-meta-endpoints/

Mon objectif final ici est de stocker de nouvelles données dans la base de données MySql pour ce champ personnalisé. J'apprends que l'API WP REST est toujours très non documentée et assez faible en ce qui concerne les métadonnées, en particulier (1) pour les types de publication personnalisés et (2) pour les non types de données chaîne/numérique.

J'envisage d'écrire une page de base PHP qui prend un ID de produit, trouve le méta-enregistrement correct à l'aide d'une fonction WordPress et met à jour les données en transformant le JSON posté en un tableau sérialisé, assez familier avec PHP pour le faire, et je devrais aussi prendre en compte des éléments de sécurité. Des exemples ou des idées sur la façon de commencer, cependant, ou s'il existe un meilleur moyen de mettre à jour mes métadonnées?

6
Chet at C2IT

Sur les problèmes initiaux, êtes-vous certain que le plug-in enregistre les champs à mettre à la disposition de l'API? le register_meta a besoin de show_in_rest => true attribué.

En outre, le CPT a besoin de custom-fields dans son tableau de supports, 'supports' => array('title','editor','thumbnail','custom-fields') pour le rendre disponible lors de l'accès au point d'extrémité de l'API CPT.

Je couvre cela (avec des liens, etc.) dans cette réponse à une autre question: https://wordpress.stackexchange.com/a/266277/118366

Si l'une de ces valeurs est manquante, vous pouvez éventuellement vous connecter pour les ajouter ou même écraser les fonctions. Juste une pensée.

J'envisage d'écrire une page de base PHP qui prend un ID de produit, trouve le méta-enregistrement correct à l'aide d'une fonction WordPress et met à jour les données en transformant le JSON posté en un tableau sérialisé, mais je ne le suis pas. assez familier avec PHP pour le faire

Pour cela, examinez json_decode et json_encode. Vous pouvez définir l'argument assoc sur true avec json_decode et obtenir un tableau plutôt qu'un objet.

Un exemple rapide (non testé) permettant de récupérer des fichiers JSON et de définir les résultats décodés dans une 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'];
    } 

}

Des exemples ou des idées sur la façon de commencer, cependant, ou s'il existe un meilleur moyen de mettre à jour mes métadonnées?

Un itinéraire et un point de terminaison personnalisés peuvent constituer le moyen le plus efficace de le faire (en supposant que ce n’est pas seulement le plugin qui n’a pas exposé ces éléments à l’API, comme indiqué plus haut). Vous devrez toujours prendre en compte les contrôles de non-respect et d'autres authentifications possibles en fonction de votre utilisation des ordinateurs d'extrémité. Itinéraires et points de terminaison et Points de terminaison personnalisés sont ce que vous recherchez dans la documentation de l'API; probablement Classes de contrôleur , aussi.

Encore une fois, je vérifierais le plug-in pour voir s'il contient les méta-champs enregistrés pour l'API comme mentionné initialement.

4
hwl