避免在 Woocommerce 中结账混合延期交货和正常商品

Avoid checkout for mixed backorder and normal items in Woocommerce

如果缺货商品与库存商品混在一起,是否可以禁用结帐功能。 如果购物车中有混合商品,目前的代码会显示消息,但他们仍然可以结帐。

我们正在使用预购插件和设置,预购和现有不能混合在购物车中。下面是插件的设置。

防止混合产品如果启用此选项,购物车将不能同时包含预购产品和常规产品。(启用)但只有在有的情况下才有效购物车中没有商品。

允许销售缺货产品 通过启用此选项,可以购买没有库存的预购产品。 (启用并允许缺货)一旦库存为零,所有商品都可以预购。

问题是如果购物车中已有商品,他们可以结帐预购商品和常规商品。请检查下面的例子

我将 产品 A(5 个库存)和 B(10 个库存)放入购物车,但我不想立即结帐.

然后有人购买了 产品 A,库存变为 0(并且 产品 A转为预购)

但是如果我继续结帐产品 A(0 个库存和预购)和 B(10 个库存)所以它已经混入购物车,我可以继续结帐,因为设置中允许延期交货。

是否可以自动删除购物车中的 产品 A 或禁用结帐?

add_action( 'woocommerce_review_order_before_payment', 'es_checkout_add_cart_notice' );

function es_checkout_add_cart_notice() {

    $message = "You have a PREORDER item/s in your cart! Do not mix it if you're ordering on-hand item/s or IGNORE this message if you are ordering all pre-order item/s.";

    if ( es_check_cart_has_backorder_product() ) 
        wc_add_notice( $message, 'error' );

}

function es_check_cart_has_backorder_product() {
    foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
        $cart_product =  wc_get_product( $values['data']->get_id() );
        if( $cart_product->is_on_backorder() )
            return true;
    }

    return false;
}

这个呢?

...
if ( es_check_cart_has_backorder_product() ) {
       add_filter('woocommerce_order_button_html', 'sg_remove_payment_button');
}
...


function sg_remove_payment_button ($button){


        $output = '<div id="payments-disabled">';
        $output .= 'Sorry, you cannot complete this order';
        $output .= '</div>';


        $output .= '<style>';
        $output .= '.payment_methods, .wc-terms-and-conditions {display: none !important}';
        $output .= '</style>';

    return $output;
}

尝试以下方法,这将真正检查混合项目并抛出错误消息避免:

  • "proceed to checkout"(在购物车页面)
  • 下订单(结帐页面)

代码:

// Display a custom notice when mixed items (backorder items and normal) avoiding checkout and "proceed to checkout" too
add_action( 'woocommerce_checkout_process', 'display_custom_error_notice' );
add_action( 'woocommerce_check_cart_items', 'display_custom_error_notice' );
function display_custom_error_notice() {
    $message = __("You have a PREORDER item/s mixed with normal items. They can not be mixed.", "woocommerce");

    if ( has_mixed_products() )
        wc_add_notice( $message, 'error' );

}

// Utility function checking for mixed items (backorder items and normal)
function has_mixed_products() {
    $on_backorder = $normal = false;

    foreach( WC()->cart->get_cart() as $cart_item ) {
        if( $cart_item['data']->is_on_backorder() )
            $on_backorder = true;
        else $normal = true;
    }
    return $on_backorder && $normal ? true : false;
}

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

在购物车页面上:

结帐页面:


Now is also possible to remove mixed items from cart throwing a notice…

有了 woocommerce,几乎一切皆有可能,这取决于您的技能和花费的时间。