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

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

Почему важно удалять старый контент и как это влияет на WordPress

С течением времени база данных WordPress может разрастаться за счёт большого количества устаревших записей, ревизий, автосохранений и мусора. Это замедляет работу сайта, увеличивает размер бэкапов и может влиять на SEO. Автоматическое удаление таких записей помогает поддерживать сайт в чистоте и стабильности.

Однако важно понимать, что удаление контента — операция необратимая, и нужно тщательно продумывать, какие именно записи удалять, чтобы не потерять важные данные.

Что такое WP-Cron и как он помогает

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

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

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

Рассмотрим практическую реализацию — удаление записей типа post, созданных более 30 дней назад. Добавьте следующий код в файл вашего дочернего шаблона functions.php или в отдельный плагин.

<?php
// Регистрируем событие cron при активации темы/плагина
function wpboot_schedule_old_posts_cleanup() {
    if ( ! wp_next_scheduled( 'wpboot_delete_old_posts_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpboot_delete_old_posts_hook' );
    }
}
register_activation_hook( __FILE__, 'wpboot_schedule_old_posts_cleanup' );

// Отключаем событие при деактивации
function wpboot_clear_old_posts_cleanup() {
    $timestamp = wp_next_scheduled( 'wpboot_delete_old_posts_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpboot_delete_old_posts_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wpboot_clear_old_posts_cleanup' );

// Основная функция удаления старых записей
function wpboot_delete_old_posts() {
    global $wpdb;
    $days = 30;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID постов старше 30 дней
    $old_posts = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_date < %s AND post_status = 'publish'",
        $date_threshold
    ) );

    if ( ! empty( $old_posts ) ) {
        foreach ( $old_posts as $post_id ) {
            wp_delete_post( $post_id, true ); // true - без возможности восстановления
        }
    }
}
add_action( 'wpboot_delete_old_posts_hook', 'wpboot_delete_old_posts' );
?>

В этом коде мы регистрируем задачу, которая запускается ежедневно и удаляет опубликованные записи старше 30 дней. Обратите внимание, что удаление происходит без помещения в корзину (второй параметр true в wp_delete_post).

Как проверить, что WP-Cron работает корректно

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

Также можно настроить системный cron (если есть доступ к серверу), чтобы вызывать WP-Cron регулярно, например, через wget или curl:

* * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Удаление записей из конкретной категории или с определённым мета-полем

Если нужно удалить записи не просто по дате, а по категории, добавим дополнительное условие WP_Query.

<?php
function wpboot_delete_old_category_posts() {
    $days = 30;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => -1,
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'category_name'  => 'novosti', // замените на вашу категорию
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        foreach ( $query->posts as $post_id ) {
            wp_delete_post( $post_id, true );
        }
    }
    wp_reset_postdata();
}
add_action( 'wpboot_delete_old_posts_hook', 'wpboot_delete_old_category_posts' );
?>

Этот код удаляет посты из категории novosti, которым больше 30 дней.

Удаление по мета-значению

Если у записей есть пользовательское мета-поле, например expired со значением 1, можно фильтровать по нему:

<?php
function wpboot_delete_expired_posts() {
    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => -1,
        'meta_key'       => 'expired',
        'meta_value'     => '1',
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        foreach ( $query->posts as $post_id ) {
            wp_delete_post( $post_id, true );
        }
    }
    wp_reset_postdata();
}
add_action( 'wpboot_delete_old_posts_hook', 'wpboot_delete_expired_posts' );
?>

Какие плагины помогут с удалением старого контента

Если вы не хотите писать код, можно использовать следующие плагины:

  • Bulk Delete — мощный инструмент для массового удаления записей по разным условиям, включая дату, категории, теги и мета-поля. Сайт плагина: https://wpshop.ru/bulk-delete
  • WP Sweep — очищает мусор из базы данных, в том числе ревизии и автосохранения, но не удаляет посты по дате напрямую.
  • Auto Post Scheduler — позволяет автоматически публиковать и удалять посты по расписанию.

При использовании плагинов обращайте внимание на отзывы, обновления и совместимость с вашей версией WordPress.

Советы по безопасности и тестированию

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

Также можно добавить в код логирование удалённых записей, например, записывать ID в отдельный лог-файл или таблицу, чтобы иметь возможность проверить, что именно было удалено.

function wpboot_log_deleted_post( $post_id ) {
    $log_file = WP_CONTENT_DIR . '/wpboot_deleted_posts.log';
    $date = date( 'Y-m-d H:i:s' );
    $entry = "{$date} - Deleted post ID: {$post_id}\n";
    file_put_contents( $log_file, $entry, FILE_APPEND );
}

// Вызовите эту функцию внутри цикла удаления, например:
// wpboot_log_deleted_post($post_id);

Это поможет отследить работу скрипта и предотвратить ошибки.

Выводы и рекомендации

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

Если не хотите писать код или нужна расширенная функциональность, рассмотрите плагины, например, Bulk Delete.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как добавить переадресацию в WordPress без плагинов
02.10.2026
Как сделать автоматический экспорт постов WordPress в Excel с помощью кода и плагинов
02.10.2026
Как изменить имя автора поста в WordPress программно
02.10.2026
Автоматическое удаление старого контента в WordPress: практическое решение
02.10.2026
Как использовать REST API WordPress для создания простых приложений
02.10.2026
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее