Автоматическое удаление старых записей в 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: пошаговое руководство
09.12.2025
WooCommerce: автоматическое изменение стоимости товара при применении купона
30.06.2026
Как добавить уникальные поля для продажи товаров в WooCommerce
04.03.2026
Как создать динамический фильтр по метаданным в WordPress
22.03.2026
Как использовать WPRemark для автоматического модератора комментариев в WordPress
14.02.2026