首页 > 解决方案 > WooCommerce:获取选择的包裹运输方式并将其存储为订单项目元数据

问题描述

案子:

在结帐时,包裹按产品的运输类别(不同品牌)进行拆分。每个包裹都有自己的运输方式,客户可以选择。

最后,当客户下订单时,我需要在 meta_data 中为每个产品存储选择的运输方式,以便我可以在管理面板和RESTAPI的订单详细信息中看到它(我使用一些外部服务来管理订单)。

我尝试过这样的事情,但我知道这很混乱,我不明白如何处理会话数据并将其存储在订单数据中。

  add_action( 'woocommerce_checkout_create_order_shipping_item', 'order_shipping_item', 20, 4 );
  function order_shipping_item($cartItemData,$order){

    foreach ( WC()->cart->get_shipping_packages() as $package_id => $package ) {
        // Check if a shipping for the current package exist
        if ( WC()->session->__isset( 'shipping_for_package_'.$package_id ) ) {
            // Loop through shipping rates for the current package
            foreach ( WC()->session->get( 'shipping_for_package_'.$package_id )['rates'] as $shipping_rate_id => $shipping_rate ) {
                $method_id   = $shipping_rate->get_method_id(); // The shipping method slug
                $instance_id = $shipping_rate->get_instance_id(); // The instance ID
                $label_name  = $shipping_rate->get_label(); // The label name of the method

            }
        }
        foreach ($package['contents'] as $item) {
          $item->add_meta_data('_shipping_method',$label_name);
          # code...
        }
    }
  }

现在我不知道如何实现这一点,任何线索?帮助!

标签: phpwordpresswoocommercehook-woocommercewoocommerce-rest-api

解决方案


以下是将每个订单商品选择的运输方式详细信息另存为自定义订单商品元数据的方法:

// Custom function that get the chosen shipping method details for a cart item
function get_cart_item_shipping_method( $cart_item_key ){
    $chosen_shippings = WC()->session->get( 'chosen_shipping_methods' ); // The chosen shipping methods
    
    foreach( WC()->cart->get_shipping_packages() as $id => $package ) {
        $chosen = $chosen_shippings[$id]; // The chosen shipping method
        if( isset($package['contents'][$cart_item_key]) && WC()->session->__isset('shipping_for_package_'.$id) ) {
            return WC()->session->get('shipping_for_package_'.$id)['rates'][$chosen];
        }
    }
}

// Save shipping method details in order line items (product) as custom order item meta data
add_action( 'woocommerce_checkout_create_order_line_item', 'add_order_line_item_custom_meta', 10, 4 );
function add_order_line_item_custom_meta( $item, $cart_item_key, $values, $order ) {
    // Load shipping rate for this item
    $rate = get_cart_item_shipping_method( $cart_item_key );

    // Set custom order item meta data
    $item->update_meta_data( '_shipping_rate_id', $rate->id ); // the shipping rate ID
    $item->update_meta_data( '_shipping_rate_method_id', $rate->method_id ); // the shipping rate method ID
    $item->update_meta_data( '_shipping_rate_instance_id', (int) $rate->instance_id ); // the shipping rate instance ID
    $item->update_meta_data( '_shipping_rate_label', $rate->label ); // the shipping rate label
    $item->update_meta_data( '_shipping_rate_cost', wc_format_decimal( (float) $rate->cost ) ); // the shipping rate cost
    $item->update_meta_data( '_shipping_rate_tax', wc_format_decimal( (float) array_sum( $rate->taxes ) ) ); // the shipping rate tax
}

代码在您的活动子主题(或活动主题)的functions.php 文件中。测试和工作。


推荐阅读