如何通过woocommerce_checkout_process动作阻止下单并获取相关信息?
使用woocommerce_checkout_process阻止订单提交的实操方案
核心结论:完全可以用woocommerce_checkout_process动作阻止订单提交
虽然它是动作而非过滤器,返回值会被忽略,但WooCommerce的 checkout 流程会检测是否存在错误通知——只要用wc_add_notice()添加error类型的提示,就能直接中断订单提交,同时把错误展示给客户。
满足你的三个需求的具体实现
1. 检查购物车所有商品
直接通过WC()->cart对象获取购物车数据,遍历每个商品即可:
// 获取购物车所有商品 $cart_items = WC()->cart->get_cart(); foreach ($cart_items as $cart_item_key => $cart_item) { $product = $cart_item['data']; // 商品对象 $product_id = $product->get_id(); $quantity = $cart_item['quantity']; // 这里写你的商品检查逻辑,比如判断商品ID、库存、类型等 }
2. 检查客户填写的字段
客户提交的 checkout 字段数据可以通过$_POST全局变量获取,或者用WooCommerce内置的方法WC()->checkout->get_posted_data()(更安全),常见字段示例:
// 获取提交的客户信息 $posted_data = WC()->checkout->get_posted_data(); $billing_name = $posted_data['billing_first_name'] . ' ' . $posted_data['billing_last_name']; $billing_phone = $posted_data['billing_phone']; $shipping_address = $posted_data['shipping_address_1']; // 这里写字段检查逻辑,比如手机号格式、必填项是否为空等
3. 添加错误提示阻止下单
当检查不通过时,调用wc_add_notice()添加错误提示,类型指定为error即可:
// 示例:如果手机号为空则阻止提交 if (empty($billing_phone)) { wc_add_notice('请填写有效的联系电话', 'error'); }
额外问题解答
1. 是否可以通过设置WooCommerce变量阻止订单提交?
官方并不推荐用变量的方式,直接用wc_add_notice()加错误通知是标准且可靠的方案。如果非要操作变量,理论上可以修改会话数据,但容易引发其他问题,没必要舍近求远。
2. 如何获取当前订单商品和客户信息?
- 订单商品:因为此时订单还未创建,只能通过
WC()->cart获取购物车中的商品数据(如上面的代码示例),订单创建后才会有WC_Order对象。 - 客户信息:直接取提交的POST数据(
$_POST或WC()->checkout->get_posted_data()),如果是已登录客户,也可以通过WC()->customer获取其账户里的信息,但提交的表单数据是用户本次填写的最新内容,优先级更高。
完整示例代码
add_action('woocommerce_checkout_process', 'custom_checkout_validation'); function custom_checkout_validation() { // 1. 检查购物车商品 $cart_items = WC()->cart->get_cart(); $has_restricted_product = false; foreach ($cart_items as $cart_item) { if ($cart_item['data']->get_id() == 123) { // 假设ID为123的商品不允许单独购买 if (count($cart_items) == 1) { $has_restricted_product = true; break; } } } if ($has_restricted_product) { wc_add_notice('商品ID123不能单独购买,请搭配其他商品下单', 'error'); } // 2. 检查客户字段 $posted_data = WC()->checkout->get_posted_data(); if (!preg_match('/^1[3-9]\d{9}$/', $posted_data['billing_phone'])) { wc_add_notice('请填写有效的中国大陆手机号', 'error'); } }
内容的提问来源于stack exchange,提问作者jsherk
相关产品推荐
相关产品推荐

