Удаление товаров WooCommerce по дате и статусу через PHP

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

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

Как проверить текущий статус и дату товаров WooCommerce

Для начала убедитесь, что товары действительно имеют нужные статусы и даты. В WooCommerce посты товаров — это записи с типом product. Их статусы могут быть стандартными WordPress (publish, draft) и специфичными WooCommerce (pending, private, trash, future).

Проверить товары с нужным статусом и датой можно через следующий WP_Query:

$args = [
    'post_type'      => 'product',
    'post_status'    => ['draft', 'pending'],
    'date_query'     => [
        [
            'before' => '6 months ago'
        ]
    ],
    'posts_per_page' => 10
];
$query = new WP_Query($args);

foreach ($query->posts as $product) {
    echo $product->ID . ' - ' . $product->post_title . "\n";
}

Так вы получите первые 10 товаров-черновиков, опубликованных более 6 месяцев назад. Это поможет убедиться, что выборка корректна.

Пошаговое решение: удаление товаров по дате и статусу

Для массового удаления используем WP_Query и функцию wp_delete_post(), которая удаляет товар с учётом всех зависимостей WooCommerce (включая метаданные и таксономии). Вот пример рабочего кода, который можно добавить в файл темы (например, в functions.php) или использовать в отдельном плагине:

function wc_delete_old_products_by_status_date() {
    $args = [
        'post_type'      => 'product',
        'post_status'    => ['draft', 'pending'],
        'date_query'     => [
            [
                'before' => '6 months ago',
            ],
        ],
        'posts_per_page' => 50, // обрабатываем по 50 товаров за запуск
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        error_log('No old products found for deletion.');
        return;
    }

    foreach ($query->posts as $product_id) {
        // Удаляем товар окончательно
        wp_delete_post($product_id, true);
        error_log("Deleted product ID: $product_id");
    }
}

// Запускаем функцию при активации сайта или вручную
// wc_delete_old_products_by_status_date();

Примечания:

  • Устанавливайте posts_per_page с учётом производительности сервера.
  • Для запуска кода вручную вызовите функцию один раз, потом закомментируйте, чтобы не удалять товары постоянно.
  • Аргумент true во wp_delete_post() гарантирует безвозвратное удаление (обход корзины).

Автоматизация через WP-CLI

Для регулярного удаления можно написать WP-CLI команду. Пример простейшей реализации:

if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wc-delete-old-products', function() {
        wc_delete_old_products_by_status_date();
        WP_CLI::success('Old products deleted by status and date.');
    });
}

Запуск из консоли: wp wc-delete-old-products.

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

Чтобы убедиться, что товары удалены корректно:

  • Повторите WP_Query из раздела диагностики — количество товаров должно уменьшиться.
  • Проверьте базу данных напрямую (таблица wp_posts) на предмет отсутствия удалённых ID.
  • Просмотрите логи ошибок сервера или error_log файла, если функция выводит логи.
  • Проверьте админку WooCommerce — отсутствуют ли удалённые товары.

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

  • Удаление без проверки резервных копий. Не запускайте скрипты удаления без резервного копирования базы данных.
  • Неправильный статус товара. Учитывайте, что WooCommerce использует как стандартные, так и дополнительные статусы. Проверяйте текущие статусы через админку.
  • Проблемы с правами доступа. Запуск кода должен происходить от имени администратора или с достаточными правами.
  • Удаление с корзиной вместо окончательного удаления. Если не указать второй параметр true в wp_delete_post, товары попадут в корзину и не освободят место.
  • Перегрузка сервера при большом количестве товаров. Делайте удаление пакетами и не запускайте многоразово без пауз.

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

  • Обязательно делайте резервное копирование базы данных перед массовыми изменениями.
  • Используйте WP-CLI для безопасного и быстрого запуска массовых операций.
  • Ограничивайте количество удаляемых товаров за один проход (например, 50 или 100).
  • Добавьте логирование и уведомления об удалении для контроля.
  • Оптимизируйте таблицы базы данных после удаления (через phpMyAdmin или WP-CLI).
  • Если сайт большой, рассмотрите использование плагинов для массового управления товарами с поддержкой фильтров по статусу и дате.

Сравнение методов удаления товаров WooCommerce

МетодПлюсыМинусы
WP_Query + wp_delete_postГибкость, можно подстроить под любые условия, без сторонних плагиновТребует навыков программирования, риск ошибок при неправильном коде
WP-CLI командаБыстрое выполнение, удобно для админов и разработчиков, можно запускать по расписаниюТребует доступа к серверу по SSH, не всегда доступно на shared-хостингах
Плагины массового управления товарамиУдобный интерфейс, готовые фильтры и функции, минимальный риск ошибокМогут замедлить сайт, не всегда бесплатны, ограничены функционалом
Удаление товаров WooCommerce со статусом «В очереди» через PHP-код
30.04.2026
Автоматизация создания резервных копий WordPress с помощью плагинов
08.03.2026
Как удалить все посты в WordPress через WP-CLI: эффективное решение для очистки сайта
06.12.2025
Как автоматически отключить плагины на отдельных страницах WordPress для оптимизации
26.04.2026
Как настроить автоматическое сохранение черновиков в WordPress для защиты контента
24.12.2025