Дробное количество товара в WooCommerce
На данный момент существует большое количество разнообразных интернет-магазинов. Одни продают электронные товары (ключи для игр, книги, фильмы и прочее), другие же реализуют материальную продукцию – стулья, столы, различную технику. Все эти товары продаются поштучно, что вполне логично для такого типа товаров. Но если вы продаете обои, различные сыпучие материалы или, например, чай, то там в распоряжении покупателя должна быть не только сама продукция, но и ее определенная единица. Например, 10 метров, 300 граммов и прочее.
По умолчанию, в CMS WordPress, а именно в её дополнении WooCommerce нет поддержки дробного количества товаров, и готовых плагинов, решая эту задачу, я также не смог найти, за исключением нескольких, которые во много усложняют процесс реализации.
А зачем, собственно, усложнять, когда можно сделать все как никогда просто? Для реализации этой задачи вам потребуется воспользоваться несколькими несложными функциями. А именно:
function fractional_amount($args, $product) {
if(!is_cart()) {
$args['input_value'] = 0.5; // Стартовое значение для карточки товара
}
$args['min_value'] = 0.5; // Минимальное значение
$args['step'] = 0.5; // Шаг
return $args;
}
add_filter('woocommerce_quantity_input_args', 'fractional_amount', 10, 2);
для переопределения стартового и минимального значения, а также шага в товаре и корзине,
// Удаление и добавление своего фильтра проверки чисел
remove_filter('woocommerce_stock_amount', 'intval');
add_filter('woocommerce_stock_amount', 'floatval');
для того, чтобы переопределить проверку на целое число и добавить возможность указания дробного.
Функцию вы настраиваете в зависимости от ваших задач, и по итогу весь код вставляете в низ файла functions.php, который находится в папке вашей темы.
Дополнительно, если вы используете AJAX-добавление товаров в корзину, вставьте следующую функцию:
function fractional_amount_ajax($args, $product) {
$args['quantity'] = 0.5; // Минимальное значение
return $args;
}
add_filter('woocommerce_loop_add_to_cart_args', 'fractional_amount_ajax', 10, 2);
Она позволит вам переопределить минимальное количество товара, которое будет добавлено, соответственно, через AJAX.
Дробное количество вариативного товара в WooCommerce
На самом деле, все описанное выше работает для всех типов товаров, единственный нюанс – это при выборе вариации товара, минимальное его значение устанавливается стандартное (единица).
Чтобы поправить это, используйте следующую функцию:
function fractional_amount_variation($data, $product, $variation) {
$data['min_qty'] = 0.5; // Минимальное значение
return $data;
}
add_filter('woocommerce_available_variation', 'fractional_amount_variation', 10, 3);
Вставляется все так же в файл functions.php вашей темы.
Дробное количество товара для определенной категории в WooCommerce
Помимо того, что на вашем сайте можно сделать выбор дробного количества товара, данную функцию можно ограничить конкретной категорией.
Для этого во всех функциях код, за исключением строки с return, вы оборачиваете в:
if(has_term(15, 'product_cat', $product->id)) {
// Код функции
}
Здесь 15 – это ID категории, для которой мы делаем дробное количество. Отрицание (для всех, кроме) будет выглядеть следующим образом:
if(!has_term(15, 'product_cat', $product->id)) {
// Код функции
}
Пример всех описанных выше функций на примере категории с ID = 15:
function fractional_amount($args, $product) {
if(has_term(15, 'product_cat', $product->id)) {
if(!is_cart()) {
$args['input_value'] = 0.5; // Стартовое значение для карточки товара
}
$args['min_value'] = 0.5; // Минимальное значение
$args['step'] = 0.5; // Шаг
}
return $args;
}
add_filter('woocommerce_quantity_input_args', 'fractional_amount', 10, 2);
function fractional_amount_ajax($args, $product) {
if(has_term(15, 'product_cat', $product->id)) {
$args['quantity'] = 0.5; // Минимальное значение
}
return $args;
}
add_filter('woocommerce_loop_add_to_cart_args', 'fractional_amount_ajax', 10, 2);
function fractional_amount_variation($data, $product, $variation) {
if(has_term(15, 'product_cat', $product->id)) {
$data['min_qty'] = 0.5; // Минимальное значение
}
return $data;
}
add_filter('woocommerce_available_variation', 'fractional_amount_variation', 10, 3);
Если вам нужно указать не одну категорию, а несколько, ID (в моем случае – 15) замените на массив значений:
[15, 25, 30]
каждое из которых – ID нужной вам категории.