Диагностика задачи: зачем отключать оплату для отдельных товаров
В WooCommerce иногда возникает необходимость запретить оплату для отдельных товаров. Например, это могут быть товары, которые выдаются бесплатно, тестовые образцы или продукты, оплачиваемые отдельно (офлайн или по счету). В стандартных настройках WooCommerce нет простого способа отключить оплату для конкретных товаров, поэтому нужно использовать кастомные решения.
Пошаговое решение: исключение оплаты для заданных товаров
1. Определение ID товаров
Для начала необходимо узнать ID товаров, для которых нужно отключить оплату. Это можно сделать в админке WooCommerce в списке товаров — в URL или в столбце ID (если он отображается).
2. Отключение кнопки «Добавить в корзину» и платежей для этих товаров
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
add_filter('woocommerce_is_purchasable', 'disable_payment_for_specific_products', 10, 2);
function disable_payment_for_specific_products($purchasable, $product) {
// Массив ID продуктов, для которых отключаем оплату
$excluded_ids = array(123, 456); // замените на свои ID
if (in_array($product->get_id(), $excluded_ids)) {
return false; // товар нельзя купить
}
return $purchasable;
}Этот фильтр отключит возможность добавлять указанные товары в корзину.
3. Исключение из оформления заказа, если товар уже есть в корзине
Если товары каким-то образом попали в корзину (например, через API или старые сессии), нужно удалить их оттуда перед оплатой. Добавьте код:
add_action('woocommerce_check_cart_items', 'remove_excluded_products_from_cart');
function remove_excluded_products_from_cart() {
$excluded_ids = array(123, 456); // ваши ID
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
if (in_array($cart_item['product_id'], $excluded_ids)) {
WC()->cart->remove_cart_item($cart_item_key);
wc_add_notice('Товар "' . $cart_item['data']->get_name() . '" не доступен для покупки.', 'error');
}
}
}Проверка результата после внедрения
- Перейдите на страницу товара с ID из массива
$excluded_ids— кнопка «Добавить в корзину» должна отсутствовать или быть неактивной. - Попробуйте добавить товар в корзину вручную по URL — товар не должен добавляться.
- Если товар оказался в корзине, при попытке оформить заказ должен появиться уведомляющий об ошибке и товар должен быть удалён из корзины.
Частые ошибки и как их исправить
- Ошибка: Кнопка «Добавить в корзину» отображается, но товар не удаляется из корзины.
Причина: Фильтрwoocommerce_is_purchasableне отключает добавление через AJAX или API.
Решение: Добавьте проверку и удаление товара из корзины, как показано во втором хукеwoocommerce_check_cart_items. - Ошибка: Товар отображается как purchasable, хотя должен быть заблокирован.
Причина: ID товара указан неверно или массив$excluded_idsпуст.
Решение: Проверьте правильность ID товаров и что массив заполнен. - Ошибка: Код не работает после обновления WooCommerce.
Причина: Изменения в API WooCommerce.
Решение: Проверьте документацию WooCommerce, обновите хуки и методы, например, используйте$product->get_id()вместо$product->id.
Практические советы по безопасности и производительности
- Не храните ID продуктов жестко в коде — лучше вынесите в настройки через
Options APIили в отдельный админский раздел. - Если нужно отключать оплату по условиям (категория, тег), используйте фильтр
has_term()для динамического определения. - Кэшируйте результаты проверки, если проверяете большое количество товаров для уменьшения нагрузки.
- Тестируйте на staging-сайте, чтобы не нарушить логику работы корзины и оформления заказа.
Сравнение решений: плагин vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Готовый плагин (например, "WooCommerce Catalog Mode") | Быстрая настройка, поддержка, обновления | Может быть избыточным, загружать сайт, не всегда гибкий |
| Кастомный код | Легковесный, точечный, оптимизированный под задачу | Требует навыков, нужно поддерживать самостоятельно |