web-dev-qa-db-fra.com

Mettre à jour les méta-données d'élément de ligne - API WooCommerce

bloqué en essayant de mettre à jour les champs méta des éléments de campagne que j'ai associés à chaque élément de campagne. D'un appel à une commande particulière, vous pouvez voir la méta de l'élément de campagne jointe ci-dessous:

"line_items":[  
      {  
         "id":243,
         "name":"Example Product",
         "product_id":194,
         "variation_id":0,
         "quantity":2,
         "tax_class":"",
         "subtotal":"84.00",
         "subtotal_tax":"0.00",
         "total":"84.00",
         "total_tax":"0.00",
         "taxes":[  ],
         "meta_data":[  
            {  
               "id":2197,
               "key":"_tracking_number",
               "value":""
            },
            {  
               "id":2198,
               "key":"_estimate_delivery_date",
               "value":""
            },
            {  
               "id":2199,
               "key":"_carrier",
               "value":""
            },
            {  
               "id":2200,
               "key":"_service",
               "value":""
            },
         ]

L’idée est que notre distributeur enregistrera chaque commande par programme, puis mettra à jour la méta, ce qui déclenchera un courrier électronique de confirmation d’expédition.

Mon problème est quand je tente de mettre à jour la méta moi-même (testing) avec curl comme ci-dessous:

--data '{"status":"completed","line_items":{"0":{"meta_data":{"_tracking_number":"being tracked"}}}}'

Je reçois une erreur en disant:

"Invalid parameter(s): line_items","data":{"status":400,"params":{"line_items":"line_items[0][meta_data] is not of type array."}}

C'est de la confusion car line_items est certainement un tableau! J'ai également essayé d'utiliser l'ID d'élément de campagne spécifique, mais basé sur l'ID d'élément de ligne de structure de retour et les métadonnées sont les deux clés de niveau supérieur dans un objet d'élément de ligne.

J'accède simplement à line_items[0] pour tester car je n'ai qu'un seul élément de campagne et la valeur line_item est un tableau, comme vous pouvez le voir ci-dessus.

line_items[0][meta_data] semble également être un tableau autant que je sache. Des conseils sur ce que je fais mal?

J'ai également pensé que les éléments de campagne sont accessibles dans l'itinéraire lui-même:

/wp-json/wc/v2/orders/2594/line_items

mais beaucoup d'itérations de cela (aussi en tant que param) ne fonctionnaient pas non plus.

EDIT: Je devais donc ajouter l'ID de produit associé à l'élément de ligne pour une raison quelconque ... Les travaux cURL suivants (HTTP 200) fonctionnaient, mais ne mettaient pas à jour le champ. J'utilise v2 de l'API.

--data '{"status":"completed","line_items":{"0":{"product_id":"194","meta_data":{"3":{"_carrier":"carrier"}}}}}'

Une idée pourquoi cela ne se met pas à jour?

1
HectorOfTroy407

Pour une raison quelconque, vous devez doubler les tableaux, peut-être que cela ne vous concerne pas car vous faites référence au premier élément. J'utilise ceci en PHP:

function saveMetaItem($id_order,$id_item,$id_product,$meta_key,$meta_value){
    $woo = new wooclient();
    $data = array(
        'line_items' => array(array(
                       'id' => $id_item,
                       'product_id' => $id_product,
                       'meta_data' => array(array(
                            'key' => $meta_key,
                            'value' => $meta_value
                               ))
                       ))
    );
    $result = $woo->put('orders/'.$id_order, $data);
    return $result;
}

Notez les appels double array () dans line_items et meta_data. Indiquez également id et product_id. Convertissez-le en JSON et c'est fini ;-)

1
Hokascha