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

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

В WooCommerce при большом количестве вариаций товаров часто возникают ситуации, когда некоторые варианты остаются неактивными (out of stock) или не продаются длительное время. Это приводит к путанице у клиентов, увеличивает нагрузку на базу данных и замедляет работу сайта. Диагностировать проблему можно следующим образом:

  • Проверить наличие вариаций со статусом "нет в наличии" в админке WooCommerce на странице редактирования товара.
  • Использовать SQL-запрос для поиска вариантов с мета-ключом _stock_status со значением outofstock.
  • Анализировать логи продаж и заказы, чтобы определить варианты, которые не покупались более X дней.

Пример SQL-запроса для поиска неактивных вариаций:

SELECT p.ID, p.post_title, m.meta_value as stock_status FROM wp_posts p
INNER JOIN wp_postmeta m ON p.ID = m.post_id
WHERE p.post_type = 'product_variation'
AND m.meta_key = '_stock_status'
AND m.meta_value = 'outofstock';

Пошаговое решение: автоматическое отключение неактивных вариантов

Для автоматического отключения неактивных вариантов товаров можно написать кастомный скрипт, который будет запускаться по крону. Скрипт будет искать варианты с запасом 0 или статусом outofstock и менять их статус на draft или private, чтобы они не отображались на сайте.

Шаг 1. Добавление функции для изменения статуса вариаций

function wc_disable_outofstock_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $variation) {
            // Меняем статус вариации на 'draft'
            wp_update_post([
                'ID'          => $variation->ID,
                'post_status' => 'draft',
            ]);
        }
    }
}

Шаг 2. Настройка WP-Cron для регулярного запуска

Добавьте в functions.php темы или в отдельный плагин следующий код для запуска функции по расписанию:

// Регистрируем событие при активации темы/плагина
if (!wp_next_scheduled('wc_disable_variations_cron')) {
    wp_schedule_event(time(), 'daily', 'wc_disable_variations_cron');
}

// Добавляем хук для нашего действия
add_action('wc_disable_variations_cron', 'wc_disable_outofstock_variations');

// Очистка при деактивации (если в плагине)
register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wc_disable_variations_cron');
});

Шаг 3. Опциональная фильтрация по времени неактивности

Чтобы отключать варианты, которые не продавались более определённого количества дней, понадобится дополнительная логика и хранение даты последней продажи. В WooCommerce эта информация хранится в заказах, что усложняет выборку. Можно использовать мета-данные или кэшировать последние продажи. Для простоты, здесь рассмотрим только статус outofstock.

Проверка результата после внедрения

  • В админке WooCommerce перейдите в список вариаций товара и убедитесь, что варианты со статусом outofstock теперь имеют статус draft и не видны на сайте.
  • Проверьте страницу товара на фронтенде — неактивные варианты не должны отображаться в селекторах выбора.
  • Проверьте логи cron (например, с помощью плагина WP Crontrol), чтобы убедиться, что событие выполняется.

Частые ошибки и как их исправить

  • Ошибка: Вариации не меняют статус после запуска скрипта.
    Причина: Неправильный мета-запрос или отсутствие прав на обновление постов.
    Решение: Проверьте права пользователя, от имени которого запускается скрипт (обычно это админ). Проверьте правильность мета-ключа _stock_status.
  • Ошибка: Скрипт не запускается по расписанию.
    Причина: WP-Cron отключен или не настроен.
    Решение: Убедитесь, что на сайте регулярный трафик или настройте системный cron для вызова wp-cron.php.
  • Ошибка: Вариации пропали с сайта, хотя должны быть доступны.
    Причина: Скрипт отключил варианты без учёта наличия товара.
    Решение: Добавьте дополнительные проверки на наличие товара и логику возврата вариаций в статус publish, если товар снова появился в наличии.

Практические советы по безопасности и производительности

  • Запускайте скрипт не чаще одного раза в сутки, чтобы не перегружать базу данных.
  • Используйте транзиенты или кэширование для хранения результатов проверки, если добавляете сложную логику.
  • Не меняйте статус вариаций без резервного копирования базы данных, особенно на больших магазинах.
  • Для крупных магазинов с тысячами вариаций лучше выполнять обновления пакетами с ограничением количества обрабатываемых записей за один запуск.

Сравнение способов решения задачи

МетодПлюсыМинусы
Ручное отключение через админкуПростота, контрольТрудозатратно при большом количестве вариантов
Кастомный скрипт с WP-CronАвтоматизация, масштабируемостьТребует навыков разработки, риск ошибок без тестирования
Плагины для управления запасами (например, Stock Manager)Удобный интерфейс, дополнительные функцииНагрузка на сайт, возможные конфликты
⭐⭐⭐⭐⭐