Автоматическое удаление товаров WooCommerce со статусом "Черновик" старше 30 дней

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

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

Чтобы выявить количество таких товаров, можно выполнить SQL-запрос напрямую на базе данных WordPress:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product' AND post_status = 'draft';

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

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

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

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

function wpkpi_delete_old_draft_products() {
    $args = array(
        'post_type'      => 'product',
        'post_status'    => 'draft',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '30 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $old_draft_products = get_posts($args);

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

2. Настраиваем планировщик задач WP-Cron для регулярного запуска

Добавьте в functions.php регистрацию события и хука, чтобы функция запускалась автоматически раз в сутки:

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

// Подключаем функцию к событию
add_action('wpkpi_daily_delete_old_draft_products', 'wpkpi_delete_old_draft_products');

3. Опционально: добавляем ручной запуск через админку

Чтобы иметь возможность запускать удаление вручную, добавьте в админ-меню кнопку:

add_action('admin_menu', function() {
    add_submenu_page(
        'tools.php',
        'Удалить старые товары-черновики',
        'Удалить старые черновики',
        'manage_options',
        'wpkpi-delete-old-drafts',
        'wpkpi_delete_old_drafts_page'
    );
});

function wpkpi_delete_old_drafts_page() {
    if (isset($_POST['wpkpi_delete_old_drafts_nonce']) && wp_verify_nonce($_POST['wpkpi_delete_old_drafts_nonce'], 'wpkpi_delete_old_drafts')) {
        wpkpi_delete_old_draft_products();
        echo '<div class="updated notice"><p>Удаление завершено.</p></div>';
    }
    ?>
    <div class="wrap">
        <h1>Удалить товары-черновики старше 30 дней</h1>
        <form method="post">
            <?php wp_nonce_field('wpkpi_delete_old_drafts', 'wpkpi_delete_old_drafts_nonce'); ?>
            <p><input type="submit" class="button button-primary" value="Удалить"></p>
        </form>
    </div>
    <?php
}

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

  • Зайдите в админку WooCommerce → Товары и установите фильтр по статусу «Черновик». Проверьте, что количество товаров-черновиков старше 30 дней уменьшилось или равно нулю.
  • Для проверки работы WP-Cron можно использовать плагин WP Crontrol. В списке задач должно появиться и выполняться событие wpkpi_daily_delete_old_draft_products.
  • При ручном запуске через новый пункт меню «Инструменты → Удалить старые черновики» должен выводиться уведомляющий блок об успешном выполнении.

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

  • Функция не запускается автоматически: Проверьте, активирован ли WP-Cron. Он может не работать, если на сайте нет трафика или отключён в wp-config.php (константа DISABLE_WP_CRON = true). Решение — настроить системный cron на сервере или проверить плагин WP Crontrol.
  • Удаление не происходит: Убедитесь, что пользователь, под которым выполняется функция, имеет права на удаление товаров. Проверьте, что посты действительно имеют статус draft и дата создания старше 30 дней.
  • Потеря данных: Всегда делайте резервную копию базы перед массовым удалением. Вызов wp_delete_post() с вторым параметром true удаляет записи навсегда без возможности восстановления из корзины.

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

  • Устанавливайте лимит на количество удаляемых товаров за один запуск, чтобы избежать таймаутов сервера. Например, замените 'posts_per_page' => -1 на 'posts_per_page' => 50 и запускайте функцию несколько раз.
  • Логируйте действия удаления в отдельный файл или таблицу, чтобы можно было отследить удалённые товары.
  • Используйте транзиенты для кеширования результата подсчёта черновиков, чтобы не нагружать базу данных лишними запросами.
  • Если у вас есть плагин Clearfy Pro от WPShop, можно дополнительно оптимизировать базу и очистить мусорные записи, что поможет поддерживать сайт в порядке.

Сравнение вариантов реализации удаления товаров-черновиков

МетодПлюсыМинусы
WP-Cron с кастомной функциейПолный контроль, без сторонних плагинов, гибкость настроекЗависит от трафика, требует навыков программирования
Плагины автоматической очистки базы (например, WP-Optimize)Простота в использовании, дополнительные функции оптимизацииМогут удалять не только нужные записи, меньше контроля
Ручное удаление через админкуБезопасно, можно проверить перед удалениемТрудозатратно при большом объёме товаров
WooCommerce: автоматическое удаление заказов по истечении срока
14.05.2026
Как создать динамическую таблицу в WordPress с AJAX и методами оптимизации
23.12.2025
Как отладить проблемы с отправкой форм в WordPress
01.04.2026
Как добавить вывод данных из метаполя в WordPress теме
16.01.2026
Как создать подробный отчет по KPI в WordPress
09.01.2026