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

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

В интернет-магазинах на WooCommerce часто скапливаются неактивные варианты товаров: те, у которых закончился запас или которые устарели и не продаются. Они замусоривают базу данных, замедляют админку и могут негативно влиять на пользовательский опыт и SEO.

Как понять, что на вашем сайте есть такие варианты? Проверьте наличие товаров с вариациями, у которых stock_status = outofstock, и которые не продавались длительное время. Для этого можно использовать запрос в базе данных или плагины анализа запасов.

Проверка неактивных вариантов через SQL

SELECT p.ID, p.post_title, pm.meta_value as sku, t.term_id FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_sku'
INNER JOIN wp_term_relationships tr ON p.ID = tr.object_id
INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN wp_terms t ON tt.term_id = t.term_id
WHERE p.post_type = 'product_variation'
AND p.post_status = 'publish'
AND pm.meta_key = '_stock_status'
AND pm.meta_value = 'outofstock';

Если запрос возвращает много строк, пора автоматизировать очистку.

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

Для удаления неактивных вариантов по расписанию мы воспользуемся WP-Cron и кастомной функцией на PHP. Ниже - пошаговая инструкция и пример кода.

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

function wpb_remove_inactive_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) {
            // Дополнительно можно проверить дату последней продажи, если требуется
            wp_delete_post($variation->ID, true); // Удаляем без возможности восстановления
        }
    }
    wp_reset_postdata();
}

2. Регистрируем событие WP-Cron для ежедневного запуска

function wpb_schedule_variation_cleanup() {
    if (! wp_next_scheduled('wpb_daily_variation_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpb_daily_variation_cleanup');
    }
}
add_action('wp', 'wpb_schedule_variation_cleanup');
add_action('wpb_daily_variation_cleanup', 'wpb_remove_inactive_variations');

3. Очистка при деактивации темы или плагина

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

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

Чтобы проверить, что удаление сработало:

  • Перейдите в раздел «Товары» - » «Вариации» (через админку или вручную в базе).
  • Запустите функцию вручную, добавив временный вызов wpb_remove_inactive_variations(); в functions.php и обновите сайт.
  • Проверьте, что вариации с _stock_status = outofstock удалены.
  • Проверьте логи ошибок и убедитесь, что нет фатальных ошибок.

Частые ошибки и пути их устранения

  • WP-Cron не запускается автоматически: Стандартный WP-Cron зависит от посещений сайта. Для надежности настройте системный cron на сервере, например:
    * * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Удаляются не те вариации: Проверьте правильность условия meta_query и статус товара. Добавьте логирование ID удаляемых элементов для отладки.
  • Удаление происходит слишком часто или слишком редко: Настройте интервал WP-Cron (daily, hourly) или создайте свой интервал через cron_schedules.
  • Потеря данных о продажах: Если нужно сохранить статистику, дополнительно перед удалением копируйте данные в архив.

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

  • Перед удалением сделайте бэкап базы данных.
  • Если вариантов очень много, разбейте удаление на партии, используя posts_per_page и смещение, чтобы избежать таймаутов.
  • Добавьте проверку прав пользователя, если функция вызывается вручную в админке.
  • Для сайтов с большим количеством товаров рассмотрите использование WP CLI для удаления вариаций вместо WP-Cron.

Сравнение методов автоматизации удаления неактивных вариантов

МетодПлюсыМинусыРекомендации
WP-Cron с кастомной функциейПростота реализации, гибкость настройки, не требует доп. плагиновЗависит от посещаемости сайта, может не сработать вовремяПодходит для средних сайтов, настройте системный cron для надежности
Плагины очистки базы (например, WP-Optimize)Удобный интерфейс, дополнительные функции оптимизацииМогут удалять лишнее, не всегда гибкие условия удаленияИспользуйте с осторожностью, проверяйте настройки
WP CLI скриптыМаксимальная производительность, не зависит от веб-сервераТребует доступа к серверу и знаний командной строкиРекомендуется для больших магазинов и опытных разработчиков
Как добавить поле с вариантами в выводе продуктов WooCommerce для удобства выбора
29.09.2026
WooCommerce AJAX обновление корзины без перезагрузки страницы: практическое руководство
09.09.2026
Как установить разные версии PHP для WordPress на одном сервере
12.09.2026
Как отключить критические остановки WordPress при ошибках плагинов
02.10.2026
Как добавить автоматическое обновление плагинов в WordPress без ручного вмешательства
25.09.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »