Автоматическое удаление старых записей в WordPress через Cron

В процессе эксплуатации сайта на WordPress часто возникает необходимость автоматически удалять устаревшие записи, например, старые новости, акции или временный контент. Вручную это делать неудобно и трудозатратно, поэтому оптимальным решением станет автоматизация через WP-Cron — встроенный планировщик задач WordPress.

Что такое WP-Cron и почему он нужен для автоматизации

WP-Cron — это виртуальный планировщик задач, который срабатывает при загрузке любой страницы сайта. Он позволяет запускать функции по расписанию, например, очищать базу, отправлять уведомления или выполнять другие задачи. В отличие от системного cron на сервере, WP-Cron не всегда срабатывает точно в нужное время, но для большинства задач этого достаточно.

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

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

Для начала создадим пользовательскую функцию, которая будет удалять записи старше заданного количества дней. В примере ниже удаляются записи типа post, которым больше 30 дней.

function wpdigest_delete_old_posts() {
    $days = 30; // Срок жизни записей в днях
    $date_query = array(
        array(
            'column' => 'post_date',
            'before' => "$days days ago",
        ),
    );

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => $date_query,
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_posts = get_posts( $args );

    if ( ! empty( $old_posts ) ) {
        foreach ( $old_posts as $post_id ) {
            wp_delete_post( $post_id, true ); // Удаление без перемещения в корзину
        }
    }
}

Эта функция находит все опубликованные записи старше 30 дней и удаляет их безвозвратно (обратите внимание на второй параметр true в wp_delete_post).

Подключение функции к WP-Cron для периодического запуска

Чтобы функция запускалась автоматически, нужно зарегистрировать событие в WP-Cron и привязать к нему нашу функцию.

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

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

add_action( 'wpdigest_cron_delete_old_posts', 'wpdigest_delete_old_posts' );

Объяснение:

  • wpdigest_schedule_old_posts_deletion проверяет, запланировано ли уже событие с ключом wpdigest_cron_delete_old_posts. Если нет, ставит его на ежедневный запуск.
  • Хук wpdigest_cron_delete_old_posts вызывает нашу функцию wpdigest_delete_old_posts.

Этот код нужно добавить в functions.php вашей темы или в отдельный плагин.

Как проверить и отладить работу WP-Cron

WP-Cron срабатывает при загрузке страниц, поэтому если на сайте мало трафика, задачи могут запускаться с задержками. Для проверки и управления планировщиком можно использовать плагин WP Crontrol. Он позволяет просматривать, добавлять, удалять и запускать задачи вручную.

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

Дополнительные настройки и расширения

Удаление по типам записей и таксономиям

Если на сайте используются кастомные типы записей, их тоже можно очистить, изменив параметр post_type в запросе. Например, для удаления старых событий (event):

'post_type' => 'event'

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

Безопасность и резервные копии

Перед автоматическим удалением рекомендуем настроить регулярное резервное копирование базы — так вы не потеряете важные данные в случае ошибки. Для этого отлично подходит плагин Clearfy Pro, который умеет автоматизировать многие задачи по безопасности и оптимизации.

Логирование удаленных записей

Для контроля можно добавить логирование в нашу функцию удаления:

function wpdigest_delete_old_posts() {
    $days = 30;
    $date_query = array(
        array('column' => 'post_date', 'before' => "$days days ago"),
    );

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'date_query' => $date_query,
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $old_posts = get_posts( $args );

    if ( ! empty( $old_posts ) ) {
        foreach ( $old_posts as $post_id ) {
            wp_delete_post( $post_id, true );
            error_log( "[wpdigest] Deleted post ID: $post_id" );
        }
    }
}

Логи можно просматривать в файле debug.log, если включить WP_DEBUG_LOG.

Альтернативный способ: системный cron и wp-cli

Если у вас есть доступ к серверу, можно настроить системный cron для запуска WP-CLI команд, например, для удаления старых записей. Это точнее и надежнее, чем WP-Cron, особенно для высоконагруженных сайтов.

Пример команды для удаления постов старше 30 дней через WP-CLI:

wp post delete $(wp post list --post_type=post --post_status=publish --date_query_column=post_date --date_query_before='30 days ago' --format=ids) --force

Эту команду можно поставить в системный cron, например, на ежедневный запуск.

Заключение

Автоматическое удаление старых записей в WordPress через WP-Cron — простое и эффективное решение для поддержки актуальности контента и оптимизации базы данных. Используя приведённые примеры, вы сможете быстро настроить эту функцию под свои нужды.

Для расширения возможностей и безопасности рекомендуем ознакомиться с плагином Clearfy Pro и инструментами управления WP-Cron, такими как WP Crontrol.

Как автоматизировать обновление кэшируемых данных в WordPress
24.03.2026
Как использовать хуки для отложенного выполнения кода в WordPress
07.12.2025
Как автоматизировать удаление спам комментариев в WordPress
01.01.2026
WooCommerce: как автоматически изменять шаблоны писем через код
11.06.2026
Как создать настройки плагина WordPress: подробное руководство для разработчиков
03.12.2025