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

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

В магазинах на WooCommerce с большим ассортиментом часто накапливаются товары, которые долгое время не обновлялись, не продаются и имеют статус «неактивен» или «черновик». Это ведёт к разрастанию базы данных, замедлению админки и ухудшению UX для покупателей. Ручное удаление таких товаров занимает много времени и чревато ошибками.

Автоматизация удаления неактивных товаров помогает поддерживать базу в актуальном состоянии и ускоряет работу магазина.

Как определить неактивные товары для удаления

В WooCommerce товар — это тип записи product. Неактивными обычно считаются товары со статусом draft, pending или private, или те, у которых дата последнего изменения более определённого срока назад (например, 180 дней).

Перед удалением важно чётко определить критерии:

  • Статус товара: draft или private
  • Дата последнего обновления: старше 180 дней
  • Отсутствие продаж за этот период (опционально)

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

1. Создаём функцию удаления

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

function wc_delete_inactive_products() {
    $args = array(
        'post_type'      => 'product',
        'post_status'    => array('draft', 'pending', 'private'),
        'date_query'     => array(
            array(
                'column'    => 'post_modified_gmt',
                'before'    => '180 days ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 50,
    );

    $query = new WP_Query($args);
    if (!$query->have_posts()) {
        return;
    }

    foreach ($query->posts as $product_id) {
        wp_delete_post($product_id, true); // true - без перемещения в корзину
    }
}

2. Регистрируем WP-Cron задачу

Добавьте код для планирования задачи, если она ещё не существует:

add_action('wc_delete_inactive_products_hook', 'wc_delete_inactive_products');

function wc_schedule_delete_inactive_products() {
    if (!wp_next_scheduled('wc_delete_inactive_products_hook')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_inactive_products_hook');
    }
}
add_action('wp', 'wc_schedule_delete_inactive_products');

3. Удаляем запланированную задачу при деактивации темы/плагина

function wc_unschedule_delete_inactive_products() {
    $timestamp = wp_next_scheduled('wc_delete_inactive_products_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_inactive_products_hook');
    }
}
add_action('switch_theme', 'wc_unschedule_delete_inactive_products');

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

  • В админке WooCommerce проверьте наличие товаров со статусом draft, pending и private, изменённых более 180 дней назад — их должно стать меньше или они должны исчезнуть после запуска cron.
  • Проверьте логи сервера или добавьте временно логирование в функцию wc_delete_inactive_products для отслеживания удалённых ID.
  • Запустите cron вручную с помощью WP-CLI: wp cron event run wc_delete_inactive_products_hook и просмотрите результаты.

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

  • Ошибка: Функция не удаляет товары.
    Причина: Не настроен WP-Cron или задача не запланирована.
    Решение: Проверьте, что cron-задание есть: wp cron event list, запустите вручную.
  • Ошибка: Удаляются товары, которые не нужно трогать.
    Причина: Некорректные критерии запроса.
    Решение: Проверьте параметры post_status и date_query, измените условия.
  • Ошибка: Производительность падает при большом количестве товаров.
    Решение: Уменьшите posts_per_page, добавьте пагинацию или пакетную обработку.

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

  • Всегда делайте резервную копию базы данных перед автоматическим удалением.
  • Используйте wp_delete_post($id, true) для полного удаления, но будьте осторожны — восстановить удалённые товары будет нельзя.
  • Для магазинов с большим количеством товаров используйте пакетную обработку с ограничением по времени выполнения PHP, чтобы избежать таймаутов.
  • Добавьте логирование действий удаления в отдельный файл или в системные логи для аудита.
  • Проверяйте, не используются ли удаляемые товары в заказах, чтобы не сломать логику.

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

МетодПлюсыМинусыПример
Ручное удаление через админкуПростота, контрольТрудоёмко, неэффективно для большого каталогаАдминка WooCommerce
Автоматический WP-Cron скриптАвтоматизация, экономия времениНужны навыки, риск удаления нужных товаровКод из статьи
Плагины очистки (например, Clearfy Pro)Готовое решение, дополнительные функцииМожет быть платным, лишние функцииClearfy Pro
Удаление проблем с AJAX-запросами в WordPress: практическое руководство
08.12.2025
Как использовать AJAX в WordPress для форм и отзывов
17.02.2026
WooCommerce: как отправлять подробные данные о заказе в Slack при оформлении
27.05.2026
Удаление старых ревизий постов в WordPress для оптимизации базы данных
06.03.2026
Как сделать автоматическое удаление старых черновиков в WordPress
02.03.2026