Диагностика задачи: зачем отключать оплату для определённых товаров в WooCommerce
В интернет-магазине на WooCommerce иногда требуется временно или постоянно отключить возможность оплаты для товаров с определённым статусом. Например, товары на стадии предзаказа, товары с истекшим сроком годности или временно недоступные позиции. В стандартном WooCommerce нет простой настройки для этого, поэтому приходится реализовывать логику самостоятельно через код или плагины.
Основная задача — не просто скрыть кнопку «Добавить в корзину», а именно запретить оплату этих товаров, чтобы покупатель не мог оформить заказ с ними.
Пошаговое решение: как отключить оплату товаров по статусу
1. Определение статуса товара
Для начала нужно понимать, в каком именно мета-поле или таксономии хранится статус товара. В WooCommerce по умолчанию статусы применяются к заказам, а для товаров чаще всего используются пользовательские поля (мета-поля) или кастомные таксономии.
Пример: у товара есть кастомное поле _custom_status со значением disabled — для таких товаров нужно запретить оплату.
2. Отключение кнопки «Добавить в корзину» и предотвращение добавления в корзину
Реализуем два уровня защиты: сначала скроем кнопку на фронтенде, затем предотвратим добавление товара в корзину через сервер.
add_filter('woocommerce_is_purchasable', 'disable_purchase_for_status', 10, 2);
function disable_purchase_for_status($is_purchasable, $product) {
$status = get_post_meta($product->get_id(), '_custom_status', true);
if ($status === 'disabled') {
return false; // товар нельзя купить
}
return $is_purchasable;
}
add_filter('woocommerce_get_price_html', 'show_price_as_unavailable', 10, 2);
function show_price_as_unavailable($price_html, $product) {
$status = get_post_meta($product->get_id(), '_custom_status', true);
if ($status === 'disabled') {
return '<span style="color:red;">Временно недоступен</span>';
}
return $price_html;
}Данный код скрывает кнопку «Добавить в корзину» и меняет отображение цены. Однако, если добавить товар вручную или через прямой вызов, нужно ещё запретить добавление в корзину.
add_filter('woocommerce_add_to_cart_validation', 'prevent_add_to_cart_for_disabled', 10, 3);
function prevent_add_to_cart_for_disabled($passed, $product_id, $quantity) {
$status = get_post_meta($product_id, '_custom_status', true);
if ($status === 'disabled') {
wc_add_notice('Оплата этого товара временно недоступна.', 'error');
return false;
}
return $passed;
}Проверка результата после внедрения
- Откройте страницу товара с мета-полем
_custom_statusсо значениемdisabled. Кнопка «Добавить в корзину» должна отсутствовать. - Цена товара должна отображаться как «Временно недоступен» красным цветом.
- Попытка добавить товар в корзину через прямой POST-запрос или другие способы должна выдать сообщение об ошибке.
- Товары без указанного статуса показываются и работают как обычно.
Частые ошибки и как их исправить
- Неверное имя мета-поля: Проверьте точное имя мета-поля, используйте
get_post_meta($product_id)через WP-CLI или в отладчике. - Кэширование мешает увидеть изменения: Очистите кэш сайта и браузера после внесения изменений.
- Конфликты с плагинами: Другие плагины могут влиять на добавление в корзину — отключите их поочерёдно для поиска конфликтов.
- Не все способы добавления в корзину блокируются: Убедитесь, что фильтр
woocommerce_add_to_cart_validationсрабатывает — при необходимости добавьте логи.
Практические советы по безопасности и производительности
- Используйте серверный запрет добавления в корзину, а не только скрытие кнопки, чтобы исключить обход на фронтенде.
- Минимизируйте количество запросов к базе при проверках — кешируйте статус товара, если он редко меняется.
- Размещайте код в дочерней теме или в кастомном плагине, чтобы избежать потери при обновлениях.
- Для массового обновления статусов используйте WP-CLI команды или SQL-запросы, чтобы не нагружать сайт.
Таблица сравнения подходов отключения оплаты
| Метод | Преимущества | Недостатки |
|---|---|---|
| Скрыть кнопку через CSS/JS | Просто и быстро | Легко обойти, не защищает от прямых запросов |
| Использовать хуки WooCommerce (как в статье) | Защищает серверно, гибко | Требует навыков PHP, возможны конфликты |
| Плагины с ограничениями товаров | Готовые решения, настройки | Могут быть тяжеловесными, не всегда точные |