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

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

Интернет-магазины на WooCommerce часто сталкиваются с проблемой "мёртвого" товара — тех товаров, которые давно не обновлялись и не продаются. Они создают нагрузку на базу данных, замедляют работу сайта и мешают покупателям находить актуальные позиции.

Удаление таких товаров вручную — трудоёмкий процесс, особенно при большом ассортименте. Автоматизация удаления по дате последнего изменения — оптимальный выход.

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

Под неактивными товарами будем понимать продукты, дата последнего обновления которых старше заданного периода, например 90 дней. Также можно учитывать статус товара — только "черновики" и "приватные" для удаления или все без исключения.

Для получения даты последнего изменения используется поле post_modified в таблице wp_posts.

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

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

function wc_delete_inactive_products_by_date( $days = 90 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID товаров, которые не обновлялись дольше $days и имеют статус 'publish' или 'draft'
    $product_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s AND post_status IN ('publish', 'draft')",
        $date_threshold
    ) );

    if ( empty( $product_ids ) ) {
        return 0; // Нет товаров для удаления
    }

    $deleted_count = 0;
    foreach ( $product_ids as $product_id ) {
        // Удаляем товар окончательно
        wp_delete_post( $product_id, true );
        $deleted_count++;
    }

    return $deleted_count;
}

2. Запускаем функцию по расписанию (WP-Cron)

Чтобы удаление происходило автоматически, добавим cron-задачу, например, раз в неделю.

function wc_schedule_delete_inactive_products() {
    if ( ! wp_next_scheduled( 'wc_delete_inactive_products_event' ) ) {
        wp_schedule_event( time(), 'weekly', 'wc_delete_inactive_products_event' );
    }
}
add_action( 'wp', 'wc_schedule_delete_inactive_products' );

add_action( 'wc_delete_inactive_products_event', function() {
    $deleted = wc_delete_inactive_products_by_date( 90 );
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log("Удалено неактивных товаров: " . $deleted);
    }
});

Как проверить, что удаление сработало

  • Заходим в админку WooCommerce > Товары и фильтруем товары по дате последнего изменения старше 90 дней — таких товаров не должно остаться.
  • В логах сервера или отладочном логировании WordPress (если включён WP_DEBUG) должна появляться запись о количестве удалённых товаров при срабатывании cron.
  • Можно временно заменить wp_delete_post($product_id, true) на error_log('Would delete product ID: '.$product_id) для теста без удаления.

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

  • Крон не срабатывает: Проверьте, что на сайте есть посещения для запуска WP-Cron или настройте системный cron для вызова wp-cron.php.
  • Удаляются лишние товары: Убедитесь, что фильтр статуса товара в запросе соответствует вашим требованиям — измените post_status при необходимости.
  • Удаление не происходит: Возможно, недостаточно прав у пользователя или плагин безопасности блокирует функцию wp_delete_post. Проверьте разрешения и логи ошибок.

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

  • Перед автоматическим удалением сделайте резервную копию базы данных.
  • Добавьте оповещение администратору по email о количестве удалённых товаров.
  • Для больших сайтов с тысячами товаров используйте пакетное удаление, чтобы избежать таймаутов:
function wc_delete_inactive_products_batch( $days = 90, $batch_size = 50 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $product_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s AND post_status IN ('publish', 'draft') LIMIT %d",
        $date_threshold,
        $batch_size
    ) );

    if ( empty( $product_ids ) ) {
        return 0;
    }

    $deleted_count = 0;
    foreach ( $product_ids as $product_id ) {
        wp_delete_post( $product_id, true );
        $deleted_count++;
    }

    return $deleted_count;
}

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

МетодПлюсыМинусыКомпромисс
Ручное удаление через админкуПростой контроль, визуальный выборОчень трудоёмко, риск забытьПодходит для магазинов с малым количеством товаров
Плагин автоочисткиУдобно, настройки через UIЗависимость от стороннего кода, нагрузкаИспользовать проверенные плагины
Код на WP-Cron, кастомный скриптГибкость, полное управление процессомТребует навыков разработкиОптимально для разработчиков и крупных магазинов
WooCommerce: автоматическое удаление заказов по неактивности и статусу
16.05.2026
Как динамически изменить автозаголовки записей в WordPress
09.04.2026
WooCommerce: как автоматически удалить отзывы после покупки без плагинов
29.04.2026
Как удалить и заблокировать комментарии в WordPress без плагинов
27.12.2025
WooCommerce: Автоматическое удаление неактивных заказов по дате
19.05.2026