Диагностика проблемы с неактивными вариациями
В WooCommerce часто встречается ситуация, когда вариации товаров перестают быть актуальными — например, товар заканчивается на складе, но вариация остаётся активной и доступной для выбора покупателем. Это приводит к ошибкам при заказе и неудобствам для пользователей. Чтобы избежать этого, необходимо автоматически отключать (скрывать) вариации, которые не доступны в наличии.
Как определить неактивные вариации?
Основным критерием является запас (stock) вариации. Если количество товара равно нулю или вариация отмечена как «нет в наличии», её нужно отключить. В WooCommerce для вариаций используется тип записи product_variation, а данные о запасах хранятся в мета-полях.
- Проверяем мета-поле
_stock_status— значенияinstockилиoutofstock. - Проверяем мета-поле
_stock— числовой остаток.
Пошаговое решение: код для автоматического отключения вариаций
Реализуем функцию, которая будет запускаться через WP-Cron и отключать вариации с нулевым или отрицательным запасом, переводя их в статус «черновик» или устанавливая флаг «скрыть».
1. Создание функции для проверки и отключения вариаций
function disable_out_of_stock_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['publish', 'private'],
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
];
$variations = get_posts($args);
foreach ($variations as $variation) {
// Переводим вариацию в черновик
wp_update_post([
'ID' => $variation->ID,
'post_status' => 'draft',
]);
}
}2. Регистрация WP-Cron задания для автоматизации
if (!wp_next_scheduled('disable_variations_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'disable_variations_cron_hook');
}
add_action('disable_variations_cron_hook', 'disable_out_of_stock_variations');Этот код запускает проверку раз в час. При необходимости интервал можно настроить через фильтр cron_schedules.
3. Альтернативный вариант: скрытие вариаций без смены статуса
Если нужно не переводить вариацию в черновик, а просто скрыть из выбора, можно менять мета-поле _visibility или использовать фильтр отображения вариаций в фронтенде.
add_filter('woocommerce_variation_is_active', function($active, $variation) {
if ('outofstock' === $variation->get_stock_status()) {
return false;
}
return $active;
}, 10, 2);Проверка результата после внедрения
Чтобы убедиться, что автоматическое отключение работает:
- Проверьте в админке WooCommerce список вариаций — неактивные должны иметь статус «черновик» или быть скрыты.
- В витрине товара на сайте вариации с нулевым запасом должны исчезать из выпадающих списков.
- Для дополнительной проверки можно включить логирование в функцию и просматривать логи по cron.
Частые ошибки и их исправление
- Ошибка: WP-Cron не запускается автоматически.
Решение: Проверьте, работает ли wp-cron.php (можно запускать вручную через браузер или настроить системный cron). - Ошибка: Вариации не скрываются на фронтенде, хотя статус поменялся.
Решение: Используйте фильтрwoocommerce_variation_is_activeдля дополнительного скрытия, если шаблон темы не учитывает статус вариаций. - Ошибка: Производительность падает из-за большого количества вариаций.
Решение: Добавьте пагинацию в запрос, обрабатывайте вариации партиями, либо запускайте крон с меньшей частотой.
Практические советы по безопасности и производительности
- Обязательно делайте резервное копирование базы перед массовыми изменениями статусов.
- Для больших магазинов используйте WP-CLI скрипты вместо WP-Cron для повышения надежности.
- Кэшируйте результаты запросов, чтобы не перегружать базу данных.
- Добавьте проверку nonce и прав пользователя, если расширяете функционал для запуска вручную из админки.
Сравнение вариантов автоматического отключения вариаций
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Изменение статуса на "черновик" | Полное исключение вариации из витрины и поиска | Невозможно быстро вернуть вариацию в продажу без ручной правки | Для долгосрочного отключения |
Фильтр woocommerce_variation_is_active |
Гибкое скрытие без изменения статусов | Зависит от темы и шаблонов, возможны баги отображения | Для временного скрытия |
Изменение мета-поля _visibility |
Простая реализация | Не всегда корректно работает с вариациями | Редкие случаи |