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

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

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

Задача — автоматически удалять товары-черновики, которым больше 30 дней, чтобы поддерживать базу в чистоте и ускорить работу с товарами.

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

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

Добавим в файл functions.php темы (рекомендуется использовать дочернюю тему или плагин для кастомного кода) функцию, которая будет искать товары со статусом draft и датой создания старше 30 дней, и удалять их.

function wpkpi_delete_old_draft_products() {
    $args = [
        'post_type'      => 'product',
        'post_status'    => 'draft',
        'date_query'     => [
            'before' => date('Y-m-d', strtotime('-30 days')),
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $draft_products = get_posts($args);

    if (!empty($draft_products)) {
        foreach ($draft_products as $product_id) {
            wp_delete_post($product_id, true); // true – удаление без возможности восстановления
        }
    }
}

2. Планирование регулярного запуска с помощью WP-Cron

Чтобы функция запускалась автоматически, добавим событие в WP-Cron:

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

add_action('wpkpi_daily_delete_old_drafts', 'wpkpi_delete_old_draft_products');

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

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

Чтобы проверить, что код работает:

  • Создайте тестовый товар со статусом "Черновик" и датой публикации более 30 дней назад (можно вручную изменить дату публикации в базе или использовать плагин).
  • Запустите функцию вручную (например, вызвав wpkpi_delete_old_draft_products() через консоль WP-CLI или временно добавив вызов в functions.php).
  • Проверьте, что товар удалён из списка товаров в админке.
  • После этого удалите вызов функции вручную, чтобы не запускать удаление при каждом запросе.

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

  • Функция не запускается автоматически: Проверьте, что WP-Cron работает. В некоторых хостингах WP-Cron отключён. Запустите вручную cron через WP-CLI или настройте системный cron.
  • Удаляются не те товары: Убедитесь, что в запросе правильно указан post_type и post_status. Например, если используются кастомные статусы — учтите их.
  • Нет прав на удаление: Код запускается с правами текущего пользователя. При использовании WP-Cron это обычно админские права, но если нет — проверьте разрешения.
  • Незначительная нагрузка при большом количестве товаров: Если товаров много, лучше удалять партиями (например, по 50 за раз), чтобы избежать таймаута.

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

  • Резервное копирование: Перед автоматическим удалением важно иметь резервные копии базы, чтобы избежать потери данных.
  • Логирование удалений: Добавьте запись в лог для отслеживания удалённых товаров:
function wpkpi_delete_old_draft_products() {
    $args = [
        'post_type'      => 'product',
        'post_status'    => 'draft',
        'date_query'     => [
            'before' => date('Y-m-d', strtotime('-30 days')),
        ],
        'posts_per_page' => 50,
        'fields'         => 'ids',
    ];

    $draft_products = get_posts($args);

    if (!empty($draft_products)) {
        foreach ($draft_products as $product_id) {
            wp_delete_post($product_id, true);
            error_log('Deleted draft product ID: ' . $product_id);
        }
    }
}
  • Оптимизация запросов: Используйте posts_per_page с ограничением для уменьшения нагрузки, запускайте удаление в несколько итераций.
  • Тестирование на staging-сайте: Перед внедрением на боевом сайте проверяйте работу на тестовом окружении.

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

МетодПреимуществаНедостаткиКогда использовать
Ручное удаление через админку WooCommerce Простота, контроль Трудозатратно при большом количестве Мало товаров, редкие чистки
Автоматический WP-Cron с кастомной функцией (код) Полный контроль, без плагинов Требует навыков разработки, возможно нагрузка Средние и крупные магазины, регулярное удаление
Плагины для очистки базы (например, WP-Optimize) Удобство, дополнительные функции оптимизации Могут быть избыточными, нагрузка, нет специфики по статусам товаров Общая оптимизация базы, не только товары
Как создать подробный отчет по KPI в WordPress
09.01.2026
Автоматическое удаление старых шаблонов в WordPress
11.04.2026
Как удалить текст из запроса поисковика в WordPress
10.11.2025
Как создать автоматический сбор данных KPI в WordPress с примерами кода
12.03.2026
Как создать динамическую таблицу в WordPress с AJAX и методами оптимизации
23.12.2025