如何根据配送方式为WooCommerce订单添加自定义元数据
解决WooCommerce 3.0+根据配送方式添加订单自定义元数据的问题
嘿,我来帮你把这个方案补全!你已经找对了WooCommerce 3.0+推荐的CRUD方法钩子woocommerce_checkout_create_order,接下来只需要完善逻辑就能实现需求啦。
核心实现代码
首先是添加元数据的核心函数,它会在订单创建时自动获取结账时选中的配送方式,并把相关信息存入订单元数据:
add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2); function before_checkout_create_order( $order, $data ) { // 从会话中获取用户选中的配送方式ID(结账时默认只有一个选中项) $chosen_shipping_method = WC()->session->get('chosen_shipping_methods')[0]; // 可选:获取配送方式的完整对象,以便拿到更友好的显示名称 $shipping_method_obj = WC()->shipping->get_shipping_method( $chosen_shipping_method ); // 添加自定义元数据到订单 // 1. 存储配送方式ID(适合内部逻辑调用使用) $order->update_meta_data( '_chosen_shipping_method_id', $chosen_shipping_method ); // 2. 存储配送方式名称(适合前台/后台直观展示) if ( $shipping_method_obj ) { $order->update_meta_data( '_chosen_shipping_method_name', $shipping_method_obj->get_title() ); } // 注:这个钩子执行时WooCommerce会自动保存订单,但手动调用save()也没问题 $order->save(); }
可选:在订单页面展示元数据
如果需要在后台订单详情页或者前台用户订单页展示这个配送方式信息,可以添加以下代码:
后台订单详情页显示
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_shipping_method_meta_in_admin', 10, 1 ); function display_shipping_method_meta_in_admin( $order ) { $shipping_name = $order->get_meta( '_chosen_shipping_method_name' ); $shipping_id = $order->get_meta( '_chosen_shipping_method_id' ); if ( $shipping_name ) { echo '<p><strong>' . __( 'Selected Shipping Method:', 'woocommerce' ) . '</strong> ' . esc_html( $shipping_name ) . '</p>'; } elseif ( $shipping_id ) { echo '<p><strong>' . __( 'Shipping Method ID:', 'woocommerce' ) . '</strong> ' . esc_html( $shipping_id ) . '</p>'; } }
前台用户订单页显示
add_action( 'woocommerce_order_details_after_order_table', 'display_shipping_method_meta_in_frontend', 10, 1 ); function display_shipping_method_meta_in_frontend( $order ) { $shipping_name = $order->get_meta( '_chosen_shipping_method_name' ); if ( $shipping_name ) { echo '<div class="order-shipping-method-note">'; echo '<p><strong>' . __( 'Your Selected Shipping Method:', 'woocommerce' ) . '</strong> ' . esc_html( $shipping_name ) . '</p>'; echo '</div>'; } }
实用小提示
- 元键开头的下划线
_是WooCommerce的惯例,表示这个元数据是“私有”的,不会自动显示在后台订单的自定义字段列表中;如果想让它在自定义字段里可见,去掉下划线即可。 - 测试前记得清空浏览器缓存和WooCommerce的会话缓存,避免旧数据干扰结果。
- 这个方案适用于普通订单,如果你需要处理订阅订单等特殊类型,只需要调整钩子或添加类型判断逻辑即可。
内容的提问来源于stack exchange,提问作者Luke Breen
相关产品推荐
相关产品推荐

