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

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

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

Как определить неактивные товары по дате обновления

Под неактивными товарами будем понимать записи типа product, у которых post_modified старше заданного срока — например, 180 дней.

Проверить дату обновления товаров можно SQL-запросом в базе данных:

SELECT ID, post_title, post_modified FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' ORDER BY post_modified ASC;

Обратите внимание: wp_ — префикс таблиц, может отличаться в вашей установке.

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

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

function wpteam_delete_old_products() {
    $days = 180; // Количество дней неактивности
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'product',
        'post_status'    => ['publish', 'private'],
        'date_query'     => [
            [
                'column' => 'post_modified',
                'before' => $date_threshold,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // Полное удаление
        }
    }
}

2. Регистрируем событие WP-Cron, если оно ещё не запланировано

function wpteam_schedule_delete_old_products() {
    if (!wp_next_scheduled('wpteam_cron_delete_old_products')) {
        wp_schedule_event(time(), 'daily', 'wpteam_cron_delete_old_products');
    }
}
add_action('wp', 'wpteam_schedule_delete_old_products');

add_action('wpteam_cron_delete_old_products', 'wpteam_delete_old_products');

3. Добавляем код в файл functions.php вашей темы или в отдельный плагин

После добавления кода функция будет запускаться ежедневно, удаляя товары, не обновлявшиеся больше 180 дней.

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

  • В админке WooCommerce проверьте список товаров: устаревшие должны исчезнуть.
  • Для проверки можно временно установить $days = 1; и создать товар с датой обновления более суток назад — он должен удалиться после срабатывания WP-Cron.
  • В журнале ошибок PHP или с помощью плагина для логов проверьте наличие ошибок при выполнении задания.

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

  • Ошибка: задания WP-Cron не выполняются.
    Причина: WP-Cron зависит от посещений сайта. Если трафик низкий, задачи могут не запускаться.
    Решение: настроить системный cron на сервере, вызывающий wp-cron.php по расписанию.
  • Ошибка: товары не удаляются.
    Причина: неверные параметры в запросе, например, неправильный префикс таблиц или статус товаров.
    Решение: убедитесь, что товары имеют статус publish или private, и используйте WP_Query с корректными аргументами.
  • Ошибка: удаляются нужные товары.
    Причина: слишком большой период или некорректный фильтр.
    Решение: протестируйте на тестовом сайте и подберите оптимальный период неактивности.

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

  • Удаляйте товары только после резервного копирования базы данных.
  • Не используйте wp_delete_post с параметром $force_delete = false, чтобы не оставлять мусор в корзине.
  • Оптимизируйте запросы, ограничивая количество обрабатываемых товаров за один запуск, если их очень много.
  • Для больших магазинов лучше реализовать пакетную обработку с задержками для снижения нагрузки на сервер.

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

МетодПлюсыМинусыКомпромисс
WP-Cron + кастомный кодБез плагинов, гибкая настройка, полный контрольЗависит от посещаемости, требует тестированияНастроить системный cron для надёжности
Плагины автоматизации (например, WP All Import с удалением)Простота установки, готовый функционалМогут грузить сайт, ограниченная кастомизацияИспользовать на небольших сайтах
Ручное удаление через админкуПростота, полная безопасностьТрудозатратно, непрактично для больших каталоговИспользовать для точечной очистки

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.