Диагностика задачи: зачем отключать оформление заказа для отдельных товаров
В интернет-магазинах на WooCommerce иногда требуется запретить покупку определённых продуктов через оформление заказа. Например, это могут быть товары, которые продаются только офлайн, демо-версии, товары с ограничениями по региону или временно недоступные для заказа. В стандартном функционале WooCommerce нет простой опции для отключения оформления заказа на уровне конкретного товара, поэтому эту логику приходится реализовывать вручную.
Как отключить кнопку «Добавить в корзину» и оформление заказа
Первый шаг — убрать возможность добавить товар в корзину. Без товара в корзине оформление заказа становится невозможным. Для этого используется фильтр woocommerce_is_purchasable, который определяет, доступен ли товар для покупки.
Пример кода для отключения оформления заказа для конкретных ID товаров:
add_filter('woocommerce_is_purchasable', 'disable_purchase_for_specific_products', 10, 2);
function disable_purchase_for_specific_products($purchasable, $product) {
// Массив ID товаров, для которых отключаем покупку
$disabled_ids = array(123, 456, 789);
if (in_array($product->get_id(), $disabled_ids)) {
return false;
}
return $purchasable;
}Этот код можно добавить в functions.php вашей темы или в кастомный плагин.
Отключение кнопки «В корзину» на страницах архивов и товара
Иногда требуется скрыть кнопку полностью, чтобы пользователь не имел даже визуальной возможности добавить товар в корзину.
add_filter('woocommerce_loop_add_to_cart_link', 'remove_add_to_cart_button_for_disabled_products', 10, 2);
function remove_add_to_cart_button_for_disabled_products($button, $product) {
$disabled_ids = array(123, 456, 789);
if (in_array($product->get_id(), $disabled_ids)) {
return '';
}
return $button;
}Пошаговое решение: отключаем оформление заказа для продуктов с мета-полем
Если вы хотите контролировать эту логику через админку, лучше использовать кастомное мета-поле для продуктов, например disable_checkout.
- Добавьте мета-поле (например, чекбокс) на страницу редактирования товара. Можно использовать ACF или добавить вручную:
add_action('woocommerce_product_options_general_product_data', 'add_disable_checkout_field');
function add_disable_checkout_field() {
woocommerce_wp_checkbox(
array(
'id' => '_disable_checkout',
'label' => 'Отключить оформление заказа',
'description' => 'Если включено, этот товар нельзя добавить в корзину и оформить заказ.'
)
);
}
add_action('woocommerce_process_product_meta', 'save_disable_checkout_field');
function save_disable_checkout_field($post_id) {
$disable = isset($_POST['_disable_checkout']) ? 'yes' : 'no';
update_post_meta($post_id, '_disable_checkout', $disable);
}- Используйте мета-поле для отключения покупки:
add_filter('woocommerce_is_purchasable', 'disable_purchase_by_meta_field', 10, 2);
function disable_purchase_by_meta_field($purchasable, $product) {
$disable = get_post_meta($product->get_id(), '_disable_checkout', true);
if ($disable === 'yes') {
return false;
}
return $purchasable;
}- Уберите кнопку «Добавить в корзину» там же:
add_filter('woocommerce_loop_add_to_cart_link', 'remove_add_to_cart_button_by_meta', 10, 2);
function remove_add_to_cart_button_by_meta($button, $product) {
$disable = get_post_meta($product->get_id(), '_disable_checkout', true);
if ($disable === 'yes') {
return '';
}
return $button;
}Проверка результата после внедрения
- Откройте страницу продукта с отключённым оформлением заказа — кнопка «Добавить в корзину» должна отсутствовать.
- Попробуйте добавить товар по прямой ссылке — добавление не должно сработать.
- Убедитесь, что в корзине этого товара нет, оформление заказа недоступно.
- Для остальных товаров оформление заказа работает как обычно.
Частые ошибки и как их исправить
- Код не работает на кастомных типах товаров: убедитесь, что хуки применяются именно к нужному типу продукта. Для кастомных типов может понадобиться дополнительная проверка.
- Кнопка «Добавить в корзину» отображается, хотя товар отключён: возможно, кеш браузера или плагина кэширования. Очистите кеш и проверьте.
- Добавление товара в корзину происходит через ajax: убедитесь, что обработчики ajax тоже учитывают логику отключения.
- При отключении покупки на страницах товара остаётся кнопка «Купить»: дополнительно используйте фильтр
woocommerce_get_availabilityдля изменения статуса товара.
Практические советы по безопасности и производительности
- Не храните логику отключения покупки в опциях, лучше использовать мета-поля — это локализует настройки и ускоряет выборки.
- Для большого каталога товаров избегайте вызова
get_post_metaв циклах без кеширования. Используйте transient API или Object Cache для оптимизации. - Всегда проверяйте пользовательские данные при сохранении мета-полей, чтобы избежать уязвимостей.
- Для массового отключения товаров используйте WP CLI для обновления мета-полей, это быстрее и безопаснее через админку.
Сравнение вариантов реализации отключения оформления заказа
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| Жёсткий список ID в коде | Просто и быстро | Неудобно масштабировать, требует редактирования кода | Небольшое число товаров, редко меняется |
| Мета-поле для каждого товара | Гибко, доступно из админки, масштабируемо | Нужно добавить интерфейс и обработчики | Средние и большие магазины, частые изменения |
| Плагин для управления доступом | Много функций, готовые решения | Может быть избыточно, нагрузка на сайт | Большие магазины, комплексное управление |