wpcontrol.ru wordpress WPControl.ru

WooCommerce: как автоматически отключить неактивные вариации товаров

Диагностика проблемы с неактивными вариациями

В 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 Простая реализация Не всегда корректно работает с вариациями Редкие случаи
×
-15%
на премиум плагин
My Popup

Повысьте конверсию!

Получить скидку »