php - 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...
}
}
}
现在我不知道如何实现这一点,任何线索?帮助!
解决方案
以下是将每个订单商品选择的运输方式详细信息另存为自定义订单商品元数据的方法:
// 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 文件中。测试和工作。
推荐阅读
- node.js - 如何在通过 answerQuery 发送的消息中添加粗体文本?远程机器人 nodejs
- hadoop - "'hdfs' 不是内部或外部命令、可运行程序或批处理文件"
- visual-studio-code - 在vs-code中,可以在按Enter键时将当前行的缩进复制到新行,而不是转换缩进?
- python - 如何使用短正则表达式语法获取给定字符串的每个单词的最后 3 个字符?
- laravel - Laravel 邮件未使用配置的邮件主机
- python-textfsm - TextFSM:从不同的行中提取数据
- c# - 如何从 C# 中的文本文件中删除“输入”?
- regex - 最后一个'-'之后的正则表达式匹配文本
- python - 用于迁移学习的 TensorFlow hub 与 tf.keras.applications
- c# - 滑块的 DragAndDropToOffset 导致滑块位置不正确