Как автоматически удалять товары WooCommerce с неактивным статусом

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

В интернет-магазинах на WooCommerce часто накапливаются товары с неактивным статусом (например, "Черновик" или "Отключен"), которые не отображаются покупателям, но занимают место в базе данных и замедляют работу сайта. Автоматическое удаление таких товаров поможет поддерживать чистоту каталога и оптимизировать производительность.

Как проверить наличие неактивных товаров

Для начала нужно убедиться, что в базе есть товары, которые имеют статус, отличный от "publish". Для этого можно использовать следующий SQL-запрос (через phpMyAdmin или WP-CLI):

SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product' AND post_status != 'publish';

Если запрос вернул записи, значит такие товары есть, и их можно безопасно удалять или архивировать.

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

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

Ниже пример кода, который удаляет товары со статусом "draft" старше 30 дней. Код запускается по крону ежедневно.

function wpelement_delete_old_draft_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => 'draft',
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'fields' => 'ids',
        'posts_per_page' => -1,
    ];

    $draft_products = get_posts($args);

    if (!empty($draft_products)) {
        foreach ($draft_products as $product_id) {
            wp_delete_post($product_id, true); // true — удалить без перемещения в корзину
        }
    }
}

// Регистрируем ежедневное событие в WP-Cron
if (!wp_next_scheduled('wpelement_daily_delete_draft_products')) {
    wp_schedule_event(time(), 'daily', 'wpelement_daily_delete_draft_products');
}

add_action('wpelement_daily_delete_draft_products', 'wpelement_delete_old_draft_products');

2. Как настроить удаление по другим статусам и условиям

Если нужно удалять товары в статусах "pending", "private" или кастомных, просто замените параметр post_status на массив с нужными статусами:

'post_status' => ['draft', 'pending', 'private'],

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

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

После добавления кода и ожидания запуска cron (можно запустить вручную через WP-CLI или плагин для управления cron):

  • Снова выполните SQL-запрос из раздела диагностики — товары со статусом "draft" старше 30 дней должны отсутствовать.
  • Проверьте в админке WooCommerce — список товаров должен обновиться.
  • Убедитесь, что на сайте не исчезли активные товары.

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

  • Крон не запускается: Проверьте, работает ли WP-Cron, нет ли блокировок на сервере. Можно использовать плагин "WP Crontrol" для диагностики и ручного запуска.
  • Удаляются не те товары: Проверьте правильность параметров в запросе get_posts, особенно post_status и date_query.
  • Удаление не происходит: Возможно, функция wp_delete_post не вызывается или есть ошибки PHP — проверьте логи ошибок и включите WP_DEBUG.

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

  • Удаляйте только товары с неактивным статусом и с достаточным запасом по дате (например, старше 30 дней) чтобы избежать случайного удаления новых товаров.
  • Всегда делайте резервные копии базы перед внедрением автоматических удалений.
  • При большом количестве товаров разбивайте удаление на части, чтобы избежать превышения лимитов памяти и времени выполнения:
foreach (array_chunk($draft_products, 50) as $chunk) {
    foreach ($chunk as $product_id) {
        wp_delete_post($product_id, true);
    }
    sleep(1); // пауза, чтобы снизить нагрузку
}
  • Для мониторинга работы можно добавить логирование удаленных товаров в отдельный файл или таблицу.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто и безопасно для небольших магазиновНеэффективно при большом количестве товаров
Использование плагинов (например, WP Bulk Delete)Удобный интерфейс, гибкие фильтрыДополнительная нагрузка, может конфликтовать с другими плагинами
Автоматизация через WP-Cron и кастомный кодПолный контроль, можно интегрировать с другими процессамиТребует навыков разработки, риски при ошибках кода
Автоматический импорт постов из Telegram в WordPress
05.03.2026
Как удалить неактивных пользователей в WordPress: эффективные методы и примеры
19.11.2025
Создание динамического шорткода с параметрами в WordPress
16.01.2026
Как использовать AJAX в WordPress для обновления контента без перезагрузки страницы
05.12.2025
Как автоматически удалять товары из WooCommerce при низком запасе
02.06.2026