Автоматическое удаление товаров в WooCommerce по сроку хранения

Почему важно удалять устаревшие товары в WooCommerce

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

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

Первый шаг — понять, по каким критериям следует удалять товары. Обычно это:

  • Дата создания товара (например, товары, созданные более 6 месяцев назад и не имеющие продаж);
  • Отсутствие продаж за определённый период;
  • Статус товара (например, «черновик» или «ожидает подтверждения»);
  • Срок хранения, заданный в метаполях (если используется кастомное поле).

Для диагностики можно вывести список кандидатов на удаление с помощью WP_Query:

$args = [
  'post_type' => 'product',
  'date_query' => [
    [
      'before' => '6 months ago',
    ],
  ],
  'meta_query' => [
    [
      'key' => '_total_sales',
      'value' => '0',
      'compare' => '=',
      'type' => 'NUMERIC',
    ],
  ],
  'posts_per_page' => -1,
];
$query = new WP_Query($args);
foreach ($query->posts as $product) {
  echo $product->post_title . "\n";
}

Этот код выводит товары без продаж старше 6 месяцев.

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

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

Функция будет получать товары по критериям и удалять их программно:

function wpupload_delete_old_products() {
  $args = [
    'post_type' => 'product',
    'date_query' => [
      [
        'before' => '6 months ago',
      ],
    ],
    'meta_query' => [
      [
        'key' => '_total_sales',
        'value' => '0',
        'compare' => '=',
        'type' => 'NUMERIC',
      ],
    ],
    'posts_per_page' => 50, // лимит для защиты от перегрузки
    'fields' => 'ids',
  ];

  $query = new WP_Query($args);

  if (!empty($query->posts)) {
    foreach ($query->posts as $product_id) {
      wp_delete_post($product_id, true); // true — без возможности восстановления
    }
  }
}

2. Запускаем функцию через WP-Cron

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

function wpupload_schedule_product_cleanup() {
  if (!wp_next_scheduled('wpupload_weekly_product_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'wpupload_weekly_product_cleanup');
  }
}
add_action('wp', 'wpupload_schedule_product_cleanup');
add_action('wpupload_weekly_product_cleanup', 'wpupload_delete_old_products');

3. Регистрируем событие и проверяем

После добавления кода очистка товаров будет запускаться автоматически по расписанию. Для ручного теста вызовите wpupload_delete_old_products(); в файле темы или через WP-CLI.

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

  • Перейдите в WooCommerce → Товары и проверьте, что товары без продаж старше 6 месяцев удалены.
  • Выполните запрос к базе данных (например, через phpMyAdmin) и убедитесь, что записи в таблицах wp_posts и wp_postmeta для этих товаров отсутствуют.
  • Проверьте логи сервера, чтобы убедиться, что ошибок при удалении нет.
  • Для контроля можно добавить запись в лог при каждом удалении:
function wpupload_delete_old_products() {
  // предыдущий код
  if (!empty($query->posts)) {
    foreach ($query->posts as $product_id) {
      wp_delete_post($product_id, true);
      error_log("Удалён товар ID: " . $product_id);
    }
  }
}

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

  • Товары не удаляются: проверьте, что функция подключена и WP-Cron работает (используйте плагин WP Crontrol для диагностики).
  • Удаляются нужные товары: проверьте параметры date_query и meta_query, возможно, критерии слишком широкие. Добавьте логирование для отладки.
  • Высокая нагрузка при удалении большого числа товаров: уменьшите posts_per_page и запускайте процесс несколько раз на разных cron-событиях.
  • Потеря данных: перед удалением сделайте резервную копию базы и файлов.

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

  • Используйте wp_delete_post($id, true) с осторожностью: удаление без возможности восстановления. Для тестов сначала используйте false, чтобы отправлять товары в корзину.
  • Ограничьте количество удаляемых товаров за один запуск, чтобы не перегружать сервер.
  • Проверяйте работу WP-Cron: на некоторых серверах он не работает без посещений сайта, альтернативой является системный cron с WP-CLI.
  • Регулярно делайте резервные копии базы и файлов перед автоматическими удалениями.
  • Если на сайте много товаров, рассмотрите использование WP-CLI для массовых операций — это быстрее и безопаснее.

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

Метод Плюсы Минусы Рекомендуется для
Ручное удаление через админку Простота, контроль Долго, риск ошибки при большом количестве Маленькие магазины, разовые случаи
Автоматизация через WP-Cron и PHP Автоматический процесс, гибкость Зависит от корректной работы WP-Cron, нагрузка Средние и крупные магазины с регулярным обновлением
WP-CLI скрипты Высокая скорость, можно использовать системный cron Требует доступа к серверу и знаний командной строки Крупные магазины, разработчики
Автоматическое удаление файлов из WooCommerce после отмены заказа
18.05.2026
Как использовать WP-CLI для управления медиафайлами в WordPress
22.03.2026
Как сохранить и загрузить медиафайлы WordPress
22.11.2025
Как отладить проблемы загрузки файлов в WordPress с помощью WPUpload
22.02.2026
Как использовать WP Uploads для хранения пользовательских файлов в WordPress
16.03.2026

wp upload - это директория в WP для загрузки файлов. Подробнее про загрузку файлов в админку можно почитать на этой странице.