@andrey-drug

Как указать в php-скрипте исключение для категории?

Здравствуйте!

Код:
add_filter('woocommerce_add_to_cart_validation', 'check_and_limit_cart_items', 10, 3);

function check_and_limit_cart_items ($passed, $product_id, $quantity) {
	$category = 'subscriptions';
	// Если корзина пуста
	if ( WC()->cart->is_empty() )
		return $passed;
	// Поиск товаров из категории подписок
	foreach (WC()->cart->get_cart() as $cart_item) {
		if ( has_term($category, 'product_cat', $cart_item['product_id']) ) {
			// Показать сообщение
			wc_add_notice(__('A subscription is already in cart (Other items are not allowed in cart).', 'woocommerce' ), 'error');
			// Не добавляем новые товары
			return false;
		}
	}
	return $passed;
}


Никак не соображу, как добавить исключение для товаров из категории со слагом subscriptions. Чтобы оттуда можно было добавлять

Помогите, пожалуйста, разобраться, с ночи пробую разные варианты со строкой:
foreach (WC()->cart->get_cart() as $cart_item) {
if ( has_term($category, 'product_cat', $cart_item['product_id']) ) {
// Показать сообщение
wc_add_notice(__('A subscription is already in cart (Other items are not allowed in cart).', 'woocommerce' ), 'error');
// Не добавляем новые товары
return false;
}

и не выходит у меня ничего
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@abezgauz
web-кузнец
Здравствуйте.

Во-первых,
>> Помогите, пожалуйста, разобраться, с ночи пробую разные варианты со строкой:
Строками, а не строкой.

Во-вторых, "строка" тут не при чём.
// Запрет на добавление в корзину товаров из категории подписок,
// если уже есть товар из категории подписок в корзине
add_filter('woocommerce_add_to_cart_validation', 'for_subscriptions_limit_cart_items', 10, 3);

function for_subscriptions_limit_cart_items ($passed, $product_id, $quantity) {

	$subscription_category = 'subscriptions';
	// Если корзина пуста
	if ( WC()->cart->is_empty() ) {
		return $passed;
	}

	$subscription_in_cart = false;

	// Поиск товаров из категории подписок в корзине
	foreach (WC()->cart->get_cart() as $cart_item) {
		if ( has_term($subscription_category, 'product_cat', $cart_item['product_id']) ) {
			$subscription_in_cart = true;
		}
	}

	if ($subscription_in_cart) {
		// проверяем, что новый товар тоже из категории подписок
		if ( has_term($subscription_category, 'product_cat', $product_id) ) {
			// добавляем товар в корзину
			return $passed;

		// если новый товар не из категории подписок
	} else {
		// Показать сообщение
		wc_add_notice(__('A subscription is already in cart (Other items are not allowed in cart).', 'woocommerce' ), 'error');
		// Не добавляем новые товары
		return false;
		}
	}
	return $passed;
}


И третье :) Если не ошибаюсь, я продолжил мысль своего старого вопроса: https://qna.habr.com/q/917125

Кажется вы только что публиковали похожий, но удалили (сорри, если это были не вы). Анатолий мне там подсказал решение, гляньте, если что. Может быть полезно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Почему используется has_term, он же ищет метки и теги в публикациях но не в объекте в корзине. Внутри цикла скорее всего придётся делать ещё цикл что бы разобрать объект товара, можете посмотреть что вы получаете в самом цикле? Добавьте принт в цикл

print_r($cart_item['product_id']);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы