WooCommerce: как автоматически удалять неактивные варианты товаров по расписанию без плагинов

Диагностика проблемы: зачем и когда нужно удалять неактивные варианты товаров

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

Определение «неактивного» варианта товара

Вариант считается неактивным, если он:

  • не опубликован (post_status != 'publish'), или
  • имеет остаток на складе равный нулю (_stock = 0), и
  • не был продан и не обновлялся длительное время (например, 3 месяца).

В зависимости от логики магазина критерии можно корректировать.

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

1. Создаем функцию для удаления вариантов по критериям

function wpb_remove_inactive_variations() {
    // Период неактивности в днях
    $days_inactive = 90;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days_inactive . " days"));

    // Получаем ID всех вариативных товаров
    $args = [
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'post_status' => ['publish', 'private', 'draft'],
        'date_query' => [
            [
                'column' => 'post_modified_gmt',
                'before' => $date_threshold,
            ],
        ],
        'fields' => 'ids',
    ];
    $variation_ids = get_posts($args);

    foreach ($variation_ids as $variation_id) {
        $stock = get_post_meta($variation_id, '_stock', true);
        $stock_status = get_post_meta($variation_id, '_stock_status', true);
        $post_status = get_post_status($variation_id);

        // Проверяем условия неактивности
        if (($post_status !== 'publish' || $stock == 0 || $stock_status === 'outofstock')) {
            // Удаляем вариант без восстановления
            wp_delete_post($variation_id, true);
        }
    }
}

2. Добавляем крон-задачу для запуска функции ежедневно

if (!wp_next_scheduled('wpb_daily_remove_inactive_variations')) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_remove_inactive_variations');
}
add_action('wpb_daily_remove_inactive_variations', 'wpb_remove_inactive_variations');

3. Регистрируем деактивацию крон-задачи при выключении плагина или темы

function wpb_deactivate_cron() {
    $timestamp = wp_next_scheduled('wpb_daily_remove_inactive_variations');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpb_daily_remove_inactive_variations');
    }
}
register_deactivation_hook(__FILE__, 'wpb_deactivate_cron');

Как проверить, что решение работает

  • В базе данных просмотреть таблицу wp_posts с типом product_variation и статусом publish. Запомнить количество до выполнения скрипта.
  • Запустить функцию вручную (через WP-CLI или временно добавить вызов wpb_remove_inactive_variations() в functions.php).
  • Проверить, что варианты с нулевым остатком и статусом не publish удалены.
  • Для автоматической проверки подождать выполнение крон-задачи (ежедневно) и сравнить количество вариантов.

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

  • Ошибка: Крон-задача не запускается.
    Причина: Отсутствие посетителей на сайте или отключен WP-Cron.
    Решение: Настроить системный cron для вызова wp-cron.php или использовать плагин типа WP Crontrol для теста.
  • Ошибка: Удаляются нужные варианты.
    Причина: Слишком агрессивные критерии отбора.
    Решение: Добавьте дополнительную проверку, например, дату последней продажи или мета-данные, чтобы не удалять варианты, которые недавно покупались.
  • Ошибка: Функция вызывает ошибку из-за памяти.
    Решение: Обрабатывать варианты партиями, используя пагинацию в WP_Query.

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

  • Не удаляйте варианты сразу, если не уверены. Лучше сначала добавить метку «неактивно» и вручную подтвердить удаление.
  • Для больших магазинов обработку вариантов лучше разбить на несколько шагов по времени (например, через WP-Cron с интервалом в несколько часов).
  • Резервное копирование базы данных перед автоматическим удалением — обязательный пункт.
  • Ограничьте выполнение функции по времени, чтобы избежать превышения лимита памяти и времени выполнения скрипта.

Сравнение способов удаления неактивных вариантов товаров

МетодПлюсыМинусы
Ручное удаление через админкуПростой, контролируемый процессТрудоемко, неэффективно при большом количестве
Плагины для очистки WooCommerceАвтоматизация, готовый интерфейсДополнительные зависимости, возможные конфликты
Кастомный код с WP-Cron (данный способ)Полный контроль, нет лишних плагиновТребует навыков, возможные ошибки при неверной настройке
Как удалить проблему раздвоенного общего меню в WordPress
28.02.2026
Как удалить данные пользователя из базы WordPress без ошибок
19.02.2026
Как добавить поле с вариантами в выводе продуктов WooCommerce для удобства выбора
13.12.2025
Как создать плагин для WordPress с нуля: подробное руководство с примером кода
21.11.2025
Как создать свой шорткод в WordPress с примером кода
10.11.2025