在 WooCommerce 中将 BACS "on-hold" 订单限制为仅由客户一个

Limit BACS "on-hold" orders to only one by customer in WooCommerce

我们在 WooCommerce 商店中提供 BACS(银行转账)作为付款方式。 如果有人使用该方法:

我们遇到的问题是有些人利用了这一点,他们使用这种方法来预订产品。等订单取消了再做,有钱了就真的去买。

作为二手店,当然不希望这样。

有没有办法将处于“暂停”状态的 BACS 订单数量限制为只有一个?

这样一来,如果您想使用 BACS 付款,而您的电子邮件中已有一个待处理的订单,则会 return 出错,您将无法完成结帐。 当然人们可以使用不同的电子邮件,但它开始变得复杂。

感谢任何帮助。

已更新 - 使用帐单电子邮件地址添加了访客。

以下非常简单的挂钩函数将检查当前客户是否有任何“on-hold”BACS 订单,如果是,它将显示避免结帐的错误消息,如果当前订单正在使用 BACS付款方式:

add_action( 'woocommerce_checkout_process', 'action_wc_checkout_process_callback' );
function action_wc_checkout_process_callback() {
    if( is_user_logged_in() ) {
        // Get customer "on-hold" orders
        $orders = (array) wc_get_orders(['limit' => - 1, 'customer_id' => get_current_user_id(),
            'status' => 'on-hold', 'return' => 'ids']);
    } elseif ( isset($_POST['billing_email']) && ! empty($_POST['billing_email']) ) {
        // Get customer "on-hold" orders
        $orders = (array) wc_get_orders(['limit' => - 1, 'customer' => sanitize_email($_POST['billing_email']), 'status' => 'on-hold', 'return' => 'ids']);
    }

    // Check if the current customer has any "on-hold" BACS order and if current order is using BACS as payment method
    if ( isset($orders) && count($orders) > 0 && isset($_POST['payment_method']) && $_POST['payment_method'] === 'bacs' ) {
        // Display an error notice (and avoid checkout)
        wc_add_notice( __( "You have already one order awaiting payment and you can have only one at the time.", "woocommerce" ), 'error' );
    }
}

代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。