避免在Woocommerce中结帐混货和普通商品

时间:2018-07-11 08:30:28

标签: php wordpress woocommerce checkout preorder

是否有可能在库存项目中混有延期交货项目而禁用结帐。 到目前为止,如果购物车中有混合物品,则代码会显示消息,但它们仍然可以签出订单。

我们使用的是Preorder插件,在设置中,不能在购物车中混合使用preorder和现有商品。以下是插件的设置。

防止混合产品:如果启用此选项,则购物车不能同时包含预购产品和常规产品。(已启用)但仅当购物车中没有商品时,该购物车才有效。购物车。

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

问题是,如果购物车中已经有商品,他们可以签出预购商品和普通商品。请检查下面的示例

我在购物车中放入了产品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;
}

2 个答案:

答案 0 :(得分:0)

那呢?

...
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;
}

答案 1 :(得分:0)

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

  • “进行结帐”(在购物车页面中)
  • 下订单(结帐页面)

代码:

// 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文件中。经过测试,可以正常工作。

在购物车页面上:

enter image description here

在结帐页面上:

enter image description here


  

现在也可以从发出通知的购物车中删除混合物品了……

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