实现Woocommerce从用户资料自动填充订单税务字段(支持后台新建订单)
实现WordPress用户自定义字段自动填充到WooCommerce订单(支持后台新建订单)
需求说明
将WordPress用户资料中自定义字段company_tax_number或已有的billing_tax_number值,自动填充到WooCommerce订单的billing_tax_number元数据字段中,要求同时支持前台结账创建订单和后台手动新建订单两种场景。
原代码局限
你提供的代码仅绑定了woocommerce_checkout_create_order钩子,该钩子仅在前台结账流程中触发,后台手动新建订单时不会执行填充逻辑,因此需要补充后台对应的处理逻辑。
完整解决方案代码
// 定义通用的填充订单税号逻辑函数 function fill_order_tax_number_from_user_meta( $order_id ) { $order = wc_get_order( $order_id ); if ( ! $order ) return; $user_id = $order->get_customer_id(); // 游客订单无用户ID,直接返回 if ( empty( $user_id ) || $user_id == 0 ) return; // 检查订单是否已有税号,已有则跳过 $existing_tax_number = $order->get_billing_tax_number(); if ( ! empty( $existing_tax_number ) ) return; // 从用户元数据中获取税号:优先取billing_tax_number,再取company_tax_number $gst_data = get_user_meta( $user_id, 'billing_tax_number', true ); if ( empty( $gst_data ) ) { $gst_data = get_user_meta( $user_id, 'company_tax_number', true ); } // 填充并保存税号到订单 if ( ! empty( $gst_data ) ) { $order->set_billing_tax_number( $gst_data ); $order->save(); } } // 前台结账场景:订单创建时触发 add_action( 'woocommerce_checkout_create_order', function( $order, $posted_data ) { fill_order_tax_number_from_user_meta( $order->get_id() ); }, 30, 2 ); // 后台新建订单场景:订单保存后触发 add_action( 'woocommerce_admin_process_new_order', 'fill_order_tax_number_from_user_meta' ); // 可选:后台编辑订单时也触发(如果需要编辑订单时自动补全) // add_action( 'woocommerce_admin_process_shop_order_meta', 'fill_order_tax_number_from_user_meta' );
代码说明
- 通用逻辑封装:将税号填充逻辑封装为独立函数,避免重复代码,便于后续维护。
- 前台处理:通过
woocommerce_checkout_create_order钩子,在前台结账创建订单时执行填充。 - 后台处理:通过
woocommerce_admin_process_new_order钩子,覆盖后台手动新建订单的场景。 - 防重复填充:先检查订单是否已有税号,避免覆盖用户手动填写的值。
- 优先级取值:优先使用用户资料中的
billing_tax_number,为空时再回退到自定义字段company_tax_number。 - 游客订单兼容:判断用户ID是否为空,避免游客订单触发无效逻辑。
内容的提问来源于stack exchange,提问作者Mye Space
相关产品推荐
相关产品推荐

