有时,客户不小心提交了两次相同的订单,或者 WooCommerce 支付网关出现临时问题或插件冲突。
这可能导致重复收费、退款、扣款、管理成本和糟糕的用户体验。
通过检查同一客户是否在过去 2 分钟内下了相同的已付款订单,我们可以阻止第二次尝试,并显示帮助信息。
如果你也遇到过类似的情况,或者想主动预防,这里有一个快速代码段,你可以添加到你的网站,以避免重复的 WooCommerce 订单。

PHP 代码段: 如果 “相同 ”订单在 <2 分钟前提交则返回错误 @ WooCommerce Checkout
此代码段使用 woocommerce_checkout_process 与 WooCommerce 结账流程挂钩。目的是防止客户在短时间内意外下达重复订单。
在该函数中,我们首先定义一组参数来查询最近的订单。我们会使用当前结账的账单电子邮件($_POST[‘billing_email’]),查找同一客户最多下过的一个订单(‘limit’ => 1)。
我们还会检查订单是否在最近 2 分钟内创建。我们使用’date_created’ => ‘>’ . ( time() – 2 * MINUTE_IN_SECONDS ) 进行检查,这样就能过滤掉较早的订单。
接下来,我们使用 wc_get_is_paid_statuses(),只考虑已付款状态的订单。这样可以确保我们不会与失败或挂起的订单进行比较。
然后,我们将当前购物车的总金额与订单总金额进行匹配(‘total’ => WC()->cart->get_total( ‘edit’ ) ),以确认这是一个相同的订单。
最后,‘return’ => ‘ids’ 参数只检索订单 ID,从而提高了查询效率。
如果找到匹配的订单,我们会使用 wc_add_notice() 阻止结账并显示错误信息,建议客户等待后再重试。
add_action( 'woocommerce_checkout_process', 'bb_prevent_duplicate_orders' ); function bb_prevent_duplicate_orders() { $args = [ 'limit' => 1, 'customer' => $_POST['billing_email'], 'date_created' => '>' . ( time() - 2 * MINUTE_IN_SECONDS ), 'status' => wc_get_is_paid_statuses(), 'total' => WC()->cart->get_total( 'edit' ), 'return' => 'ids', ]; $orders = wc_get_orders( $args ); if ( $orders ) { wc_add_notice( __( 'It looks like you already placed this order recently. Please wait a minute before trying again.' ), 'error' ); } }
在哪里添加自定义代码?
您应将自定义 PHP 代码放在子主题的 functions.php 中,将自定义 CSS 代码放在 style.css 中。
除非您另有报告,否则这些代码仍然有效。要排除冲突,请暂时切换到 Storefront 主题,禁用除 WooCommerce 以外的所有插件,然后再次测试该代码段.