web-dev-qa-db-fra.com

Accès aux données protégées des articles de commande dans Woocommerce 3

J'essaie d'obtenir les éléments de campagne d'une commande.

Je fais ça:

$order = new WC_Order(147);
foreach ($order->get_items() as $key => $lineItem) {
    print_r('<pre>----');
    print_r($lineItem);
    print_r('----</pre>');
}

Je peux voir toutes les données dont j'ai besoin, mais le tableau montre ceci:

[meta_data:protected] => Array

Comment puis-je accéder à ce tableau pour obtenir les valeurs?

Merci.

8
bstras21

Depuis WooCommerce 3.0+ pour les articles de commande, il existe une nouvelle classe d'objets WC_Order_Item_Product .
Maintenant, les propriétés des articles de commande ne sont pas accessibles directement comme auparavant

Donc, si vous regardez vos données brutes de sortie, vous verrez que chaque élément de campagne est maintenant un objet, et vous pourrez accéder à ces données protégées en utilisant exclusivement:

  1. WC_Order_Item_Product méthodes getters (ou pour le changer avec les méthodes des setters)…
  2. WC_Order_Itemget_formatted_meta_data( '', true ) méthode pour accéder à toutes les métadonnées. Il donne un tableau d'objets accessibles. Voir WC_Data méthode get_meta() pour accéder à chaque métadonnée.
  3. WC_Data obtient des méthodes pour déprotéger ces données et y accéder via des tableaux à l'aide de méthodes:
    • get_data() (cette méthode est très utile)
    • get_meta() (cette méthode est la plus utile)
    • get_data_keys()
    • get_meta_data() ( ne déprotège pas les données , utilisez get_formatted_meta_data())
  4. wc_get_order_item_meta() fonction dédiée.

Les méthodes des getters WC_Order_Item_Product:

// Get an instance of the WC_Order object
$order = wc_get_order(147);

// Iterating through each order item
foreach ($order->get_items() as $item_id => $item ) {
    echo $item->get_type().'<br>'; // The order item type
    echo $item->get_product_id().'<br>'; // The Product ID
    echo $item->get_variation_id().'<br>'; // The variation ID
    echo $item->get_quantity().'<br>'; // Line item quantity
    echo $item->get_subtotal().'<br>'; // Line item subtotal
    echo $item->get_total().'<br>'; // Line item total

    // The associated product object (which properties can't be accessed directly too)
    echo '<pre>'; print_r( $item->get_product() ); echo '</pre>'; 

    // ... and so on ...

    ## Testing raw output (protected)
    // echo '<pre>'; print_r($item); echo '</pre>';
}

La fonction wc_get_order_item_meta() . Ici, vous pouvez entrer dans le tableau wp_woocommerce_order_itemmeta et sortir toutes les données pour un ID d'article en utilisant le correspondant meta_key (pour line_item ID d'élément de type de données):

// Get an instance of the WC_Order object
$order = wc_get_order(147);

// Iterating through each order item
foreach ($order->get_items() as $item_id => $item ) {

    echo wc_get_order_item_meta( $item_id, '_product_id', true). '<br>'; // Product ID
    echo wc_get_order_item_meta( $item_id, '_variation_id', true). '<br>'; // Variation ID
    echo wc_get_order_item_meta( $item_id, '_qty', true). '<br>'; // quantity
    echo wc_get_order_item_meta( $item_id, '_line_subtotal', true). '<br>'; // Line subtotal

    // ... and so on ...

    ## Testing raw output (protected data)
    // echo '<pre>'; print_r($item); echo '</pre>';
}

La méthode WC_Dataget_data() (pour déprotéger les données d'un tableau) :

// Get an instance of the WC_Order object
$order = wc_get_order(147);

// Iterating through each order item
foreach ($order->get_items() as $item_id => $item ) {

    // Get the most useful Item product data in an accessible array
    $item_data = $item->get_data();

    echo $item_data['id'].'<br>'; // The order item ID
    echo $item_data['order_id'].'<br>'; // The order ID
    echo $item_data['product_id'].'<br>'; // The Product ID
    echo $item_data['variation_id'].'<br>'; // The Variation ID
    echo $item_data['name'].'<br>'; // The Product title (name)
    echo $item_data['quantity'].'<br>'; // Line item quantity
    echo $item_data['subtotal'].'<br>'; // Line item subtotal
    echo $item_data['total'].'<br>'; // Line item total

    // ... and so on ...

La méthode WC_Dataget_meta() (pour accéder à chaque propriété par sa méta-clé ):

// Get an instance of the WC_Order object
$order = wc_get_order(147);

// Iterating through each order item
foreach ($order->get_items() as $item_id => $item ) {

    echo $item->get_meta('_product_id').'<br>'; // The Product ID
    echo $item->get_meta('_variation_id').'<br>'; // The Variation ID
    echo $item->get_meta('_qty').'<br>'; // Line item quantity
    echo $item->get_meta('_line_subtotal').'<br>'; // Line item subtotal
    echo $item->get_meta('_line_subtotal_tax').'<br>'; // Line item subtotal tax
    echo $item->get_meta('_line_total').'<br>'; // Line item total
    echo $item->get_meta('_line_tax').'<br>'; // Line item total tax

    // Product attributes for variation
    echo $item->get_meta('pa_color').'<br>'; // Color
    echo $item->get_meta('pa_size').'<br>'; // Color

    // Custom item meta gata
    echo $item->get_meta('custom_meta_key').'<br>'; // custom meta key visible
    echo $item->get_meta('_custom_meta_key').'<br>'; // custom meta key not visible


    // ... and so on ...

Connexes: Comment obtenir les détails de la commande WooCommerce

23
LoicTheAztec

Pour obtenir les données de [meta_data:protected] => Array, Vous devez utiliser une autre méthode.

Utilisez simplement cette $item_obj->get_meta_data();

Pour les obtenir plus en détail, répétez-les deux fois comme suit:

  $order = wc_get_order( $order_id );
  foreach ($order->get_items() as $item_id => $item_obj) {

         $kua = $item_obj->get_meta_data();

         foreach ($kua as $key => $value) {
            foreach ($value as $key2 => $value2) {
               echo $key2.'->'.$value2.'<br>';
            }
        }
  }

La collection des méthodes se trouve ici

2