如何在 WooCommerce 3 中获取订单嵌套元数据

How do I get order nested meta data in WooCommerce 3

我们为 WooCommerce 安装了另一个名为 Booster Plus for WooCommerce 的插件,此插件可以通过 invoice number 支付订单来修改 checkout page

我也通过显示 invoice number 来自定义我们的 thank you page。目前,我无法做到这一点,因为我不知道如何正确获取嵌套 $order->get_data() 结果的值。

<?php 
  $order_data = $order->get_data();
  print_r($order_data);
?>

上面 order_data 的结果如下所示:

(
    [id] => 7403
    [discount_total] => 0
    [discount_tax] => 0
    [shipping_total] => 0.00
    [shipping_tax] => 0
    [cart_tax] => 2.47
    [total] => 21.47
    [total_tax] => 2.47
    [customer_id] => 20
    [order_key] => wc_order_8pt3q7T79
    [billing] => Array
    (
      [first_name] => John
      [last_name] => Done
      [company] => g2x
      [address_1] => 3134 James Street
      [address_2] => 
      [city] => Moose Factory
      [state] => ON
      [postcode] => P0L 1W0
      [country] => CA
      [email] => testjohndoe123@gmail.com
      [phone] => 705-658-2112
    )
    [cart_hash] => 087347d19dff4677dc8kaeb2b2c653c6
    [number] => 7403
    [meta_data] => Array
    (
      [0] => WC_Meta_Data Object
        (
          [current_data:protected] => Array
              (
                  [id] => 102652
                  [key] => mailchimp_woocommerce_campaign_id
                  [value] => 
              )

          [data:protected] => Array
              (
                  [id] => 102652
                  [key] => mailchimp_woocommerce_campaign_id
                  [value] => 
              )
        )

      [1] => WC_Meta_Data Object

      [2] => WC_Meta_Data Object

      [3] => WC_Meta_Data Object

      [4] => WC_Meta_Data Object

      [5] => WC_Meta_Data Object
      (
        [current_data:protected] => Array
        (
          [id] => 102694
          [key] => _wcj_custom_payment_gateway_input_fields
          [value] => Array
          (
            [pay_by_po] => 123456789
          )
        )

        [data:protected] => Array
        (
          [id] => 102694
          [key] => _wcj_custom_payment_gateway_input_fields
          [value] => Array
            (
              [pay_by_po] => 123456789
            )
        )
      )
    [coupon_lines] => Array
    ()

)

你知道我怎样才能得到 [pay_by_po] 的值 123456789 吗?任何帮助是极大的赞赏。谢谢。

您可以使用 WC_data method get_meta_data(), which gives an array of WC_Meta_Data 对象获取和取消保护此嵌套元数据:

$meta_data = $order->get_meta_data();
print_r($order_data);

然后在每个 WC_Meta_Data 对象上,您可以像 get_data() 一样使用 WC_Meta_Data available methods 来提供不受保护的数据数组:

foreach( $order->get_meta_data() as $meta_data_obj ) {
    $meta_data_array = meta_data_obj->get_data();
    print_r($meta_data_array);

    $meta_key   = $meta_data_array['key']; // The meta key
    $meta_value = $meta_data_array['value']; // The meta value
}

您还可以使用 WC_Data method get_meta() 从特定元键直接获取订单中的任何嵌套元数据,如下所示:

$meta_value = $order->get_meta('_wcj_custom_payment_gateway_input_fields');
print_r($meta_value);

Note This nested meta data exist since WooCommerce version 3.


关于摘要WC_DataClass

它由 类 使用相同的 CRUD 模式实现。

直接知子类:
WC_Abstract_Legacy_OrderWC_Abstract_Legacy_ProductWC_Customer_DownloadWC_Customer_Download_LogWC_Legacy_CouponWC_Legacy_CustomerWC_Legacy_Payment_TokenWC_Legacy_Shipping_ZoneWC_Legacy_Webhook, WC_Order_Item

间接已知子类:
WC_Abstract_OrderWC_CouponWC_Payment_TokenWC_Payment_Token_CCWC_Payment_Token_ECheckWC_ProductWC_Product_ExternalWC_Product_GroupedWC_Product_Simple, WC_Product_Variable, WC_Product_Variation, WC_Shipping_Zone, WC_Customer, WC_Webhook, WC_Order, WC_Order_Item_Coupon, WC_Order_Item_Fee, WC_Order_Item_Product, WC_Order_Item_Shipping, WC_Order_Item_Tax, WC_Order_Refund

参见:Developing using WooCommerce CRUD objects