Как удалить старые и неиспользуемые товары WooCommerce с помощью кода

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

Со временем каталог WooCommerce может разрастаться за счет устаревших, неактивных или тестовых товаров, которые больше не продаются и не нужны. Наличие таких товаров замедляет работу админки, увеличивает размер базы данных и может влиять на SEO. Зачастую владельцы магазинов задаются вопросом, как быстро и безопасно удалить эти записи массово, чтобы не потерять нужные данные.

Критерии выбора товаров для удаления

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

  • Товары, которые не обновлялись более 1 года.
  • Товары со статусом "Черновик" или "Ожидает проверки".
  • Товары с запасом 0 и без продаж за последний год.

Как получить список таких товаров в базе

Для диагностики можно использовать SQL-запросы или WP-CLI, но удобнее писать PHP-скрипт, который выведет ID и названия кандидатов на удаление.

function get_old_woocommerce_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => ['draft', 'pending'],
        'date_query' => [
            [
                'before' => '1 year ago'
            ]
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);
    return $query->posts;
}

// Выведем ID и названия
$old_products = get_old_woocommerce_products();
foreach ($old_products as $product_id) {
    $title = get_the_title($product_id);
    echo "ID: $product_id - $title<br>";
}

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

Удалять товары нужно аккуратно, чтобы не затронуть связанные данные и не нарушить работу магазина.

Шаг 1. Создаем функцию удаления по критериям

function wpguest_delete_old_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => ['draft', 'pending'],
        'date_query' => [
            [
                'before' => '1 year ago'
            ]
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);
    if (empty($query->posts)) {
        return 'No old products found for deletion.';
    }

    foreach ($query->posts as $product_id) {
        // Удаляем товар вместе с метаданными и связанными данными
        wp_delete_post($product_id, true); // true - без возможности восстановления
    }

    return count($query->posts) . ' old products deleted successfully.';
}

Шаг 2. Запускаем функцию вручную или по расписанию

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

add_action('init', function () {
    if (current_user_can('administrator') && isset($_GET['delete_old_products'])) {
        echo wpguest_delete_old_products();
        exit;
    }
});

После этого достаточно в браузере перейти по адресу https://example.com/?delete_old_products=1 под администратором и дождаться вывода результата.

Шаг 3. Автоматизация с помощью WP-Cron

Чтобы регулярно очищать магазин от старых товаров, можно создать задачу WP-Cron:

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

add_action('wpguest_cron_delete_old_products', 'wpguest_delete_old_products');

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

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

  • Посмотрите в админке WooCommerce > Товары — должны исчезнуть товары, подходящие под критерии.
  • Воспользуйтесь SQL-запросом для проверки количества товаров с нужным статусом и датой обновления:
SELECT COUNT(*) FROM wp_posts
WHERE post_type = 'product'
AND post_status IN ('draft','pending')
AND post_modified < DATE_SUB(NOW(), INTERVAL 1 YEAR);
<

Если результат 0 или значительно меньше, значит очистка прошла успешно.

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

  • Удаляются нужные товары: проверьте критерии выборки, уточните дату и статус, добавьте дополнительную проверку метаполей.
  • Ошибка при удалении из-за зависимостей: wp_delete_post с параметром true удаляет метаданные, но если есть сторонние связи (плагины, кросс-продажи), удаление может быть неполным. В таком случае нужно дополнительно очищать custom tables или связи.
  • Удаление не запускается: убедитесь, что функция вызывается, права пользователя подходят, и нет блокировок по безопасности (например, модуль безопасности сервера).

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Для больших магазинов удаление лучше делать пакетно, например, по 50 товаров за один запуск, чтобы не перегружать сервер.
  • Используйте WP-CLI для удаления, если у вас есть доступ к серверу, это быстрее и надежнее.
  • Отключите индексацию этих товаров поисковыми системами перед удалением (через метатег robots или плагин Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wpguest.ru&utm_medium=article&utm_campaign=kak-udalit-starye-i-neispolzuemye-tovary-woocommerce-s-pomoshhyu-koda).

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПросто, не требует кодаДолго, неэффективно для больших каталогов
PHP-код с WP_Query и wp_delete_postАвтоматизация, гибкие критерии, можно запускать по расписаниюНужны навыки разработки, риск ошибки без тестирования
WP-CLI команды (wp post delete)Быстро, подходит для больших баз, не зависит от сайтаТребуется доступ к серверу, командная строка
Плагины очистки базыУдобно для новичков, готовые решенияМогут не иметь нужных условий, нагрузка на сайт
Как автоматизировать удаление старого кеша в WordPress
08.04.2026
Как автоматизировать удаление неиспользуемых transient в WordPress
16.04.2026
Как автоматизировать управление отзывами в WordPress с помощью WPRemark
14.02.2026
Как использовать автоматическое очищение кеша в WordPress без плагинов
21.02.2026
Автоматическое удаление старых товаров WooCommerce по дате
17.06.2026