Можно ли отключить оформление заказа, если товар, заказанный заранее, смешан с товарами на складе. Код пока отображает сообщение, если в корзине есть смешанные товары, но они все еще могут оформить заказ.
Мы используем плагин 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;
}