如何在WooCommerce购物车优惠券区下方添加订单备注字段并同步至结账页?
没问题,我来帮你实现这个需求!下面是完整的解决方案,分步骤帮你搞定购物车添加备注并同步到结账页和订单的功能:
实现步骤
1. 在购物车优惠券区域下方添加备注字段
我们用woocommerce_after_cart_coupon钩子来插入字段,这个钩子正好位于优惠券区域的下方,完美匹配你的需求。字段的样式和结账页的订单备注保持一致:
add_action('woocommerce_after_cart_coupon', 'add_cart_order_notes_field'); function add_cart_order_notes_field() { // 获取已保存的购物车备注(如果有的话) $cart_notes = WC()->session->get('cart_order_notes', ''); echo '<div class="cart-order-notes">'; echo '<h3>' . __('Order Notes', 'woocommerce') . '</h3>'; echo '<textarea name="cart_order_notes" rows="4" class="input-text" placeholder="' . __('Add any notes about your order, e.g. special instructions for delivery.', 'woocommerce') . '">' . esc_textarea($cart_notes) . '</textarea>'; echo '</div>'; }
2. 保存购物车备注到WooCommerce会话
当用户更新购物车(或者填写备注后点击更新按钮),我们需要把备注内容保存到会话中,这样在整个购物流程中都能读取到:
add_action('woocommerce_update_cart_action', 'save_cart_order_notes_to_session'); function save_cart_order_notes_to_session() { if (isset($_POST['cart_order_notes'])) { // 清理并保存备注到会话 $cart_notes = sanitize_textarea_field($_POST['cart_order_notes']); WC()->session->set('cart_order_notes', $cart_notes); } }
3. 同步购物车备注到结账页订单字段
接下来,我们要把购物车中保存的备注同步到结账页的“Order Notes”字段,让用户能看到之前填写的内容,也可以随时修改:
add_filter('woocommerce_checkout_fields', 'sync_cart_notes_to_checkout'); function sync_cart_notes_to_checkout($fields) { $cart_notes = WC()->session->get('cart_order_notes', ''); // 如果购物车有备注且结账页备注为空,自动填充内容 if (!empty($cart_notes) && empty($fields['order']['order_comments']['default'])) { $fields['order']['order_comments']['default'] = $cart_notes; } return $fields; }
4. 确保备注被添加到最终订单
最后一步,要保证不管用户是在购物车还是结账页填写的备注,都会被正确添加到订单的客户备注中:
add_action('woocommerce_checkout_create_order', 'add_cart_notes_to_order'); function add_cart_notes_to_order($order) { $cart_notes = WC()->session->get('cart_order_notes', ''); $checkout_notes = isset($_POST['order_comments']) ? sanitize_textarea_field($_POST['order_comments']) : ''; // 优先使用结账页修改后的备注,没有的话用购物车的内容 $final_notes = !empty($checkout_notes) ? $checkout_notes : $cart_notes; if (!empty($final_notes)) { $order->set_customer_note($final_notes); // 清空会话中的备注,避免后续流程重复添加 WC()->session->__unset('cart_order_notes'); } }
使用说明
把上面的代码复制到你的WordPress主题的functions.php文件中,或者创建一个自定义插件来添加这些代码。这样:
- 用户在购物车优惠券下方填写的备注会实时保存
- 进入结账页后,订单备注字段会自动填充购物车的内容
- 最终订单的客户备注会显示用户填写的内容,不管是在哪个页面填写的
内容的提问来源于stack exchange,提问作者Rudolfs
相关产品推荐
相关产品推荐

