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

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

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

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

Для начала нужно понять, какие товары считать неактивными. Обычно это:

  • товары с статусом draft или private;
  • товары, у которых дата последней модификации или публикации была давно (например, более 180 дней назад);
  • товары с нулевым количеством продаж и без заказов;
  • товары, у которых установлен статус outofstock.

Проверить товары с такими параметрами можно с помощью SQL-запросов к базе или WP_Query с нужными аргументами.

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

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

function wpclass_delete_inactive_products() {
    // Параметры для выборки товаров
    $args = [
        'post_type'      => 'product',
        'post_status'    => ['draft', 'private', 'trash'],
        'date_query'     => [
            [
                'column' => 'post_modified_gmt',
                'before' => '180 days ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            // Удаляем товар без возможности восстановления (force delete)
            wp_delete_post($product_id, true);
        }
    }
}

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

add_action('wpclass_daily_cleanup', 'wpclass_delete_inactive_products');

if (!wp_next_scheduled('wpclass_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpclass_daily_cleanup');
}

3. Добавляем код в файл темы functions.php или создаем маленький плагин

Рекомендуется использовать отдельный плагин для удобства контроля и отключения, если потребуется.

Проверка результата

После внедрения кода:

  • Подождите выполнение WP-Cron (обычно при посещении сайта);
  • Проверьте, что товары с указанными параметрами действительно удалились из каталога и базы данных;
  • Для проверки можно временно добавить error_log или уведомления, например:
function wpclass_delete_inactive_products() {
    // ...
    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true);
            error_log('Deleted product ID: ' . $product_id);
        }
    }
}

Логи можно посмотреть в файле debug.log, если включен WP_DEBUG_LOG.

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

  • Товары не удаляются: возможно, WP-Cron не срабатывает. Проверьте работу Cron с помощью плагина WP Crontrol или замените вызов на прямой запуск функции для теста.
  • Удаляются лишние товары: проверьте правильность условий выборки в WP_Query, особенно параметры post_status и meta_query.
  • Ошибка прав доступа: убедитесь, что пользователь запускающий WP-Cron имеет права на удаление товаров, обычно это администратор сайта.
  • Большая нагрузка при удалении: если товаров много, разбейте удаление на части с ограничением posts_per_page и используйте повторный запуск Cron.

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

  • Перед автоматическим удалением сделайте резервную копию базы данных.
  • Не используйте удаление с параметром force_delete = true, если хотите возможность восстановления — замените на мягкое удаление.
  • Оптимизируйте запросы, добавляя индексы в базу, если выборка по мета-полям занимает много времени.
  • Для повышения производительности используйте кеширование и разбивайте процесс удаления на несколько шагов.

Альтернативы: код против плагинов

МетодПреимуществаНедостатки
Код на PHP (WP-Cron)Гибкость, нет зависимости от сторонних плагинов, можно кастомизировать под свои условияТребует навыков разработки, возможны ошибки при некорректном написании
Плагины для очистки каталогаПростота использования, готовые интерфейсы и настройкиМогут быть тяжелыми, влиять на производительность, не всегда подходят под узкие задачи
Как установить разные верстки блоков Gutenberg в WordPress
01.01.2026
Как создать собственный шорткод в WordPress
04.11.2025
Как отключить WooCommerce Cart Fragments для улучшения производительности
03.05.2026
Как создать автоподпись в WordPress с помощью хуков
29.12.2025
Как удалить редиректы после изменения структуры URL в WordPress
05.12.2025