wpnotes.ru wordpress WP Notes

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

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

Что такое WPNotes_cron и зачем нужен WP Cron в WordPress

WordPress из коробки имеет встроенную систему планировщика задач – WP Cron. Она запускается при посещении сайта и позволяет выполнять периодические задачи. Однако для автоматического удаления старых записей нужно создать свою задачу, которая будет запускаться, например, ежедневно или еженедельно.

WPNotes_cron – это название функции, которую мы создадим для удаления записей по определённым критериям. Она будет вызываться планировщиком.

Важно понимать, что WP Cron не идеален для сайтов с низкой посещаемостью, так как задачи запускаются при посещении. Для более надёжной работы стоит настроить системный CRON на сервере, который будет вызывать wp-cron.php. Но в большинстве случаев встроенный WP Cron достаточно.

Как зарегистрировать CRON задачу в WordPress

Для начала нам нужно зарегистрировать собственное событие и привязать к нему функцию удаления записей. Добавим следующий код в файл functions.php вашей темы или в отдельный плагин:

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

Здесь мы создаём событие wpnotes_daily_old_posts_cleanup, которое будет запускаться ежедневно.

Функция удаления старых записей: критерии и реализация

Теперь реализуем функцию, которая будет удалять записи старше заданного срока. Например, удалим все записи типа post, которым больше 90 дней.

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

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        '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 ); // true - принудительное удаление без перемещения в корзину
        }
    }
}
add_action( 'wpnotes_daily_old_posts_cleanup', 'wpnotes_delete_old_posts' );

Обратите внимание, что мы используем хук wpnotes_daily_old_posts_cleanup, который запускает нашу функцию в нужное время.

Особенности и безопасность удаления записей

Удаление происходит принудительно, без помещения в корзину. Это быстро и экономит место, но будьте осторожны, чтобы случайно не удалить важные данные.

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

Расширение: удаление старых записей пользовательских типов и с фильтрами

Если у вас на сайте есть кастомные типы записей (CPT), например, events или offers, можете добавить их в список для очистки.

function wpnotes_delete_old_custom_posts() {
    $days_old = 60; // для кастомных типов
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );

    $post_types = array( 'events', 'offers' );

    foreach ( $post_types as $post_type ) {
        $args = array(
            'post_type'      => $post_type,
            'post_status'    => 'publish',
            'date_query'     => array(
                array(
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ),
            ),
            '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 );
            }
        }
    }
}
add_action( 'wpnotes_daily_old_posts_cleanup', 'wpnotes_delete_old_custom_posts' );

Также можно фильтровать по метаполям, например, удалять только записи с метаполем expired равным true:

$args['meta_query'] = array(
    array(
        'key'   => 'expired',
        'value' => 'true',
    ),
);

Полезные плагины для мониторинга и управления CRON задачами

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

  • WP Crontrol — позволяет просматривать, редактировать и запускать задачи WP Cron.
  • Clearfy Pro — оптимизационный плагин, в числе функций которого есть расширенное управление WP Cron и очистка базы.

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

Чтобы убедиться, что ваша CRON-задача выполняется, можно сделать несколько шагов:

  1. Установите плагин WP Crontrol и проверьте, что событие wpnotes_daily_old_posts_cleanup отображается в списке.
  2. Вручную запустите задачу через интерфейс плагина и посмотрите, удалились ли записи.
  3. Добавьте временный лог в функцию удаления, чтобы записывать время и количество удалённых записей в файл или в системный лог.

Пример добавления логирования

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

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

    $old_posts = get_posts( $args );
    $count_deleted = 0;

    if ( ! empty( $old_posts ) ) {
        foreach ( $old_posts as $post_id ) {
            if ( wp_delete_post( $post_id, true ) ) {
                $count_deleted++;
            }
        }
    }

    error_log( "[wpnotes] Deleted $count_deleted old posts on " . date('Y-m-d H:i:s') );
}
add_action( 'wpnotes_daily_old_posts_cleanup', 'wpnotes_delete_old_posts' );

Логи можно смотреть через панель хостинга или с помощью плагинов для просмотра логов.

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее