Избегайте оформления заказа на смешанные невыполненные заказы и обычные товары в Woocommerce.

Можно ли отключить оформление заказа, если товар, заказанный заранее, смешан с товарами на складе. Код пока отображает сообщение, если в корзине есть смешанные товары, но они все еще могут оформить заказ.

Мы используем плагин Preorder, и в настройках предварительный заказ и предварительный заказ не могут быть смешаны в корзине. Ниже приведены настройки плагина.

Запретить смешивание продуктов. Если вы включите эту опцию, корзина не может одновременно содержать продукты с предварительным заказом и обычные продукты. (включено) Но это работает, только если в корзине нет товаров.

Разрешить продажу товаров, которых нет в наличии. Включив этот параметр, можно приобрести товары, которых нет в наличии, по предварительному заказу. (включен и разрешен досрочное оформление) Все товары могут быть доступны для предзаказа, как только запасы станут равными нулю.

Проблема в том, что если в корзине уже есть товары, они могут оформить предзаказ и обычный товар. Пожалуйста, проверьте пример ниже

Я положил Товар A (5 шт.) И B (10 шт.) В корзину, но не хочу сразу оформлять заказ.

Затем кто-то приобрел продукт A, и запасы стали 0продукт A превратился в предварительный заказ).

Но если я перейду к оформлению заказа Продукт A (0 запасов и предварительный заказ) и B (10 запасов), значит, он уже смешан в корзине, и я могу перейти к оформлению, потому что разрешен отложенный заказ. в настройках.

Можно ли автоматически удалить Товар А из корзины или отключить оформление заказа?

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

person Jmarck    schedule 11.07.2018    source источник


Ответы (2)


Попробуйте следующее, это действительно проверит наличие смешанных элементов и выдаст сообщение об ошибке, позволяющее избежать:

  • "перейти к оформлению заказа" (на странице корзины)
  • размещение заказа (страница оформления заказа)

Код:

// 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 вашей активной дочерней темы (или активной темы). Проверено и работает.

На странице корзины:

введите здесь описание изображения

На странице оформления заказа:

введите здесь описание изображения


Теперь также можно убирать смешанные товары из корзины с уведомлением…

С woocommerce в основном возможно все, в зависимости от ваших навыков и времени, которое вы потратите.

person LoicTheAztec    schedule 11.07.2018
comment
Вау .. это работает. Еще раз спасибо @LoicThe Astec .. Я просто использую плагин Woocommerce, но не умею его настраивать .. :) - person Jmarck; 11.07.2018

Как насчет этого?

...
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;
}
person Shir Gans    schedule 11.07.2018