Исключить определенный товар Woocommerce из общего правила, как это сделать?

Ссылка скопирована
1 ответ

Здравствуйте, есть вот такой код, который устанавливает для всех товаров начальное кол-во 10

//For variable products add_filter( 'woocommerce_available_variation', 'custom_qty_available_variation_args', 10, 3 ); function custom_qty_available_variation_args( $data, $product, $variation ) {     $data['min_qty'] = 10;      return $data; } /**/

//For variable products add_filter( 'woocommerce_available_variation', 'custom_qty_available_variation_args', 10, 3 ); function custom_qty_available_variation_args( $data, $product, $variation ) { $data['min_qty'] = 10; return $data; } /**/

Подскажите как исключить из этого правила некоторые товары?

Дополнительно:

Ответы:

Вторым аргументом в эту функцию передаётся $product - это объект класса WC_Product_Variable. Можно в функции получать его различные свойства и/или мета-поля, если они были зарегистрированы - и исходя из их значений либо выставлять min_qty, либо нет

Два варианта:

  1. Совсем в лоб - исключать по перечислению ID ($product->get_id())
  2. По ID продукта получать его мета-поле, скажем, "Минимальное значение этого продукта" - и устанавливать его как min_qty

Спасибо большое. Нашёл решение в виде плагинов:
https://wordpress.org/plugins/wc-min-max-quantities/
https://wordpress.org/plugins/woo-min-max-quantity...

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция DevOps Ответ

Исключать товары из общего правила можно по ID товара, ID вариации, категории, мета-полю или отдельной настройке. В вашем фильтре для вариативных товаров доступны сразу $product и $variation, поэтому самый простой вариант — проверить ID и вернуть данные без изменения.

add_filter('woocommerce_available_variation', 'custom_qty_available_variation_args', 10, 3);
 
function custom_qty_available_variation_args($data, $product, $variation) {
    $excluded_products   = [123, 456];
    $excluded_variations = [789];
 
    if (in_array($product->get_id(), $excluded_products, true)) {
        return $data;
    }
 
    if (in_array($variation->get_id(), $excluded_variations, true)) {
        return $data;
    }
 
    $data['min_qty'] = 10;
 
    return $data;
}

add_filter('woocommerce_available_variation', 'custom_qty_available_variation_args', 10, 3); function custom_qty_available_variation_args($data, $product, $variation) { $excluded_products = [123, 456]; $excluded_variations = [789]; if (in_array($product->get_id(), $excluded_products, true)) { return $data; } if (in_array($variation->get_id(), $excluded_variations, true)) { return $data; } $data['min_qty'] = 10; return $data; }

Если исключения должны настраиваться из админки, лучше не хранить ID в коде. Добавьте ACF/мета-поле, например disable_min_qty, и проверяйте его:

if (get_post_meta($product->get_id(), 'disable_min_qty', true)) {
    return $data;
}

if (get_post_meta($product->get_id(), 'disable_min_qty', true)) { return $data; }

Для простых товаров нужен другой фильтр: woocommerce_quantity_input_args. Если правило должно работать и в карточке, и в корзине, проверьте оба места, потому что изменение min_qty в данных вариации влияет в основном на фронтенд выбора вариации.

Исключать товары из правила можно по ID товара, ID вариации, категории, мета-полю или тегу. В вашем фильтре доступны и родительский товар $product, и сама вариация $variation. Поэтому сначала проверяем, относится ли товар к исключениям, и только потом задаём min_qty.

add_filter('woocommerce_available_variation', 'custom_qty_available_variation_args', 10, 3);
 
function custom_qty_available_variation_args($data, $product, $variation) {
    $excluded_products = [123, 456]; // ID родительских товаров.
    $excluded_variations = [789];    // ID конкретных вариаций.
 
    if (in_array($product->get_id(), $excluded_products, true)) {
        return $data;
    }
 
    if (in_array($variation->get_id(), $excluded_variations, true)) {
        return $data;
    }
 
    $data['min_qty'] = 10;
    return $data;
}

add_filter('woocommerce_available_variation', 'custom_qty_available_variation_args', 10, 3); function custom_qty_available_variation_args($data, $product, $variation) { $excluded_products = [123, 456]; // ID родительских товаров. $excluded_variations = [789]; // ID конкретных вариаций. if (in_array($product->get_id(), $excluded_products, true)) { return $data; } if (in_array($variation->get_id(), $excluded_variations, true)) { return $data; } $data['min_qty'] = 10; return $data; }

Если исключать нужно по категории:

if (has_term('special-category', 'product_cat', $product->get_id())) {
    return $data;
}

if (has_term('special-category', 'product_cat', $product->get_id())) { return $data; }

Если таких товаров много, удобнее завести ACF/метаполе, например disable_min_qty, и ставить галочку в карточке товара. Тогда условие будет таким:

if (get_post_meta($product->get_id(), 'disable_min_qty', true)) {
    return $data;
}

if (get_post_meta($product->get_id(), 'disable_min_qty', true)) { return $data; }

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно