Я добавляю код, чтобы ограничить добавление в корзину исключительной категории товаров с другими продуктами (за исключением другой категории), но по какой-то причине мой код работает только один раз и не будет работать после того, как я ничего не изменю , Меня это не озадачивает.
Я использую WordPress 5.3.2 и WooCommerce 3.6.5.
Код основан на этой теме с похожим сценарием для ограничения товаров в корзине.
Пожалуйста, смотрите мой код ниже:
add_filter('woocommerce_add_to_cart_validation', 'check_breakfast_items', 10, 3);
function check_breakfast_items( $true, $product_id, $quantity ) {
// Set warning notice
$notice = __( 'Breakfast and non-breakfast items cannot be ordered at the same time.', 'woocommerce' );
$category = 'breakfast'; // Set exclusive category
$exempt_category = 'extras'; // Set exempted category not to be restricted
$true = true; // Initializing
$breakfast_product = false;
$breakfast_in_cart = false;
$extras_product = false;
$extras_in_cart = false;
// Check if cart has items
if (!WC()->cart->is_empty() ) {
$terms_slugs = wp_get_post_terms( $product_id, 'product_cat', array('fields' => 'slugs') );
// Check if the product has breakfast category
if ( in_array( $category, $terms_slugs ) ) {
$breakfast_product = true;
} else {
$breakfast_product = false;
}
// Check if the product has extras category
if ( in_array( $exempt_category, $terms_slugs ) ) {
$extras_product = true;
} else {
$extras_product = false;
}
// Check each cart item
foreach( WC()->cart->get_cart() as $cart_item ) {
$cart_item_id = $cart_item['product_id'];
$cart_terms_slugs = wp_get_post_terms( $cart_item_id, 'product_cat', array('fields' => 'slugs') );
// Check if any cart items have breakfast category
if ( in_array( $category, $cart_terms_slugs ) ) {
$breakfast_in_cart = true;
} else {
$breakfast_in_cart = false;
}
// Check if any cart items have extras category
if ( in_array( $exempt_category, $cart_terms_slugs ) ) {
$extras_in_cart = true;
} else {
$extras_in_cart = false;
}
}
// Check cart items for restriction
if ( $breakfast_product == $breakfast_in_cart ){
$true = true; // Restriction passed if product and cart items are all breakfast
} else if ( $breakfast_product == $extras_in_cart || $extras_product == $breakfast_in_cart ) {
$true = true; // Restriction passed if product and/or cart items are breakfast and extras
} else if ( $breakfast_product != $breakfast_in_cart ) {
$true = false; // Restriction not passed if product and cart items are breakfast and non-breakfast
wc_add_notice( $message, 'error' );
}
}
return $true;
}
Оригинальный код использовал has_term
для поиска слагов в категориях товаров, но по какой-то причине это не сработало для меня ( Похоже, он не может поднять продукт с несколькими категориями?)
Не могу понять, почему код перестал работать без каких-либо изменений. Если кто-то может пролить свет на это, было бы здорово. Спасибо!