You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:54