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

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

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

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

Шаг 1. Создание регулярного события WP-Cron

Для автоматического удаления товаров нужно создать задачу cron, которая будет запускаться, например, ежедневно.

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

Шаг 2. Написание функции удаления товаров по условию возраста

Удалим все товары, которые были опубликованы более 180 дней назад.

function wpmarket_delete_old_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '180 days ago',
            ),
        ),
        'fields'         => 'ids',
        'post_status'    => 'publish',
    );
    $old_products = get_posts( $args );

    foreach ( $old_products as $product_id ) {
        wp_delete_post( $product_id, true ); // true - удаление без перемещения в корзину
    }
}
add_action( 'wpmarket_daily_product_cleanup_hook', 'wpmarket_delete_old_products' );

Шаг 3. Добавление безопасности и логирования

Для отслеживания удалений добавим простое логирование в файл wp-content/debug.log.

function wpmarket_delete_old_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '180 days ago',
            ),
        ),
        'fields'         => 'ids',
        'post_status'    => 'publish',
    );
    $old_products = get_posts( $args );

    if ( empty( $old_products ) ) {
        error_log( 'No old products found for deletion on ' . date('Y-m-d H:i:s') );
        return;
    }

    foreach ( $old_products as $product_id ) {
        $title = get_the_title( $product_id );
        $deleted = wp_delete_post( $product_id, true );
        if ( $deleted ) {
            error_log( "Deleted product ID {$product_id} ({$title}) on " . date('Y-m-d H:i:s') );
        } else {
            error_log( "Failed to delete product ID {$product_id} ({$title}) on " . date('Y-m-d H:i:s') );
        }
    }
}

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

1. Включите WP_DEBUG и WP_DEBUG_LOG в wp-config.php для записи логов:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );

2. Выполните вручную событие cron (для теста) через WP-CLI:

wp cron event run wpmarket_daily_product_cleanup_hook

3. Проверьте файл wp-content/debug.log на наличие записей об удалении товаров.

4. Проверьте в админке WooCommerce, что товары с датой старше 180 дней действительно удалены.

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

  • Задача cron не запускается: Убедитесь, что WordPress посещают пользователи, или настройте системный cron для wp-cron.php. Для системного cron используйте команду: wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1.
  • Удаление не происходит: Проверьте, что функция wp_delete_post вызывается с параметром true для полного удаления, а не только в корзину.
  • Удаляются не те товары: Проверьте параметры date_query и post_status, чтобы выбирать только нужные публикации.
  • Память или время выполнения превышены: Если товаров много, разбейте процесс на части с пагинацией, например, по 100 товаров за раз.

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

  • Для больших магазинов используйте пагинацию и batch-удаление, чтобы избежать превышения лимитов PHP.
  • Логируйте только ошибки и критичные события, чтобы не перегружать debug.log.
  • Ограничьте права доступа к скриптам удаления, чтобы избежать потенциального злоупотребления.
  • Регулярно создавайте резервные копии базы данных перед автоматическим удалением.
  • Используйте плагины, такие как Clearfy Pro, для оптимизации базы и дополнительно очистки данных WooCommerce.

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

МетодПлюсыМинусы
WP-Cron с собственным кодомГибкость, полное управление, отсутствует зависимость от плагиновТребует знаний PHP, риски при ошибках в коде
Плагины очистки (например, Clearfy Pro)Простота настройки, дополнительные функции оптимизацииМожет быть избыточным, влияет на производительность при больших объемах
Ручное удаление через админкуПростота, нет риска ошибочного кодаНеэффективно при большом количестве товаров, трудоемко
Как автоматически отключить неиспользуемые плагины в WooCommerce
20.04.2026
Как удалить или скрыть страницу в WordPress без удаления из базы
20.01.2026
Как создать динамическую функцию в WordPress для отображения времени работы сайта
14.12.2025
WooCommerce: как удалить старые вариации товаров и ускорить базу
13.05.2026
Как автоматически обновлять плагины WordPress без рисков
12.03.2026