Диагностика задачи: зачем отключать оформление заказа для отдельных товаров
В WooCommerce иногда возникает необходимость запретить покупку конкретных товаров — например, если они предназначены только для показа, или требуется отдельное согласование перед заказом. Просто скрыть кнопку «Добавить в корзину» бывает недостаточно, так как пользователь может перейти в корзину и оформить заказ вручную. Задача — полностью отключить процесс оформления для выбранных продуктов без удаления их из каталога.
Пошаговое решение: отключение оформления заказа для выбранных товаров
1. Определяем товары, для которых нужен запрет оформления
Лучший способ — использовать пользовательское поле (мета-данные) или категорию. Например, добавим мета-ключ disable_checkout со значением yes для таких продуктов.
2. Блокируем добавление товара в корзину
Добавим фильтр woocommerce_is_purchasable, чтобы запретить добавление в корзину для товаров с мета-ключом disable_checkout=yes.
add_filter('woocommerce_is_purchasable', 'disable_checkout_for_specific_products', 10, 2);
function disable_checkout_for_specific_products($purchasable, $product) {
if (get_post_meta($product->get_id(), 'disable_checkout', true) === 'yes') {
return false; // Отключаем возможность покупки
}
return $purchasable;
}3. Исключаем товары из оформления заказа, если они попали в корзину
Чтобы исключить такие товары из корзины и оформления, добавим проверку в хук woocommerce_check_cart_items и удалим их с уведомлением.
add_action('woocommerce_check_cart_items', 'remove_disabled_products_from_cart');
function remove_disabled_products_from_cart() {
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product_id = $cart_item['product_id'];
if (get_post_meta($product_id, 'disable_checkout', true) === 'yes') {
WC()->cart->remove_cart_item($cart_item_key);
wc_add_notice(sprintf('Товар "%s" нельзя оформить и он был удалён из корзины.', get_the_title($product_id)), 'error');
}
}
}4. Скрываем кнопку «Добавить в корзину» на страницах товаров
Для чистоты интерфейса уберём кнопку для запрещённых товаров, используя фильтр woocommerce_is_purchasable> (см. шаг 2) или CSS-правила. Но лучше программно:
add_filter('woocommerce_is_purchasable', 'hide_add_to_cart_button_for_disabled', 10, 2);
function hide_add_to_cart_button_for_disabled($purchasable, $product) {
if (get_post_meta($product->get_id(), 'disable_checkout', true) === 'yes') {
return false;
}
return $purchasable;
}Проверка результата после внедрения решения
- Откройте страницу товара с мета-ключом
disable_checkout=yes— кнопка «Добавить в корзину» должна отсутствовать. - Попытайтесь вручную добавить такой товар через URL
?add-to-cart=ID— товар не добавится. - Если товар каким-то образом попал в корзину, при переходе к оформлению он будет удалён, а пользователь увидит предупреждение.
- Товары без мета-ключа должны работать как обычно.
Частые ошибки и как их исправить
- Ошибка: Товары с запретом всё равно отображают кнопку «Добавить в корзину».
Причина: Кэширование страниц или неправильное добавление мета-поля.
Решение: Очистите кэш, проверьте правильность ключа и значения мета-данных. - Ошибка: Товары не удаляются из корзины при оформлении.
Причина: Хукwoocommerce_check_cart_itemsне срабатывает из-за конфликта с плагинами.
Решение: Проверьте конфликтующие плагины, попробуйте добавить приоритет выше вadd_action, например 20. - Ошибка: Уведомление об удалении товара не отображается.
Причина: Ошибки в шаблонах темы или кастомные сообщения могут блокировать стандартные уведомления WooCommerce.
Решение: Проверьте шаблоны оформления и убедитесь, что вызываетсяwc_print_notices().
Практические советы по безопасности и производительности
- Используйте мета-поля, а не категории, чтобы точно контролировать поведение отдельных товаров без риска ошибочного отключения.
- Добавляйте проверки на стороне сервера (фильтр
woocommerce_is_purchasableи хукwoocommerce_check_cart_items), так как клиентские методы легко обходятся. - Минимизируйте нагрузку, кешируя результаты проверки, если каталог большой (например, через объектный кеш).
- Если используете плагины, которые влияют на корзину или процесс оформления, тестируйте совместимость с данным кодом.
Сравнение вариантов реализации запрета оформления для товаров
| Способ | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Мета-поле + код | Добавление кастомного поля и проверка через хуки | Точно контролирует отдельные товары, гибко | Требуется базовые знания PHP, возможны конфликты с плагинами |
| Использование категории | Группировка товаров в категорию и проверка по ней | Просто администрировать | Может затронуть лишние товары, менее точный контроль |
| Плагины для ограничения продаж | Готовые решения типа WooCommerce Catalog Mode | Простота, дополнительные функции (например, скрытие цен) | Зависимость от стороннего кода, ограниченная кастомизация |