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

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

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

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

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

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

я кладу Продукт А(5 акций) и В(10 штук) в корзине, но я не хочу оформлять заказ сразу.

Тогда кто-то купил Продукт А и акции становятся 0 (а также Продукт А обратиться к предзаказу)

Но если я приступлю к оформлению заказа Продукт А(0 акций и предварительный заказ) и В(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;
}

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 в основном все возможно, в зависимости от ваших навыков и времени потратить.

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

По вопросам рекламы [email protected]