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

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

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

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

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

Основные особенности WP-Cron

  • Запускается при посещении сайта, что может влиять на точность расписания;
  • Можно создавать собственные события с произвольным интервалом;
  • Для повышения точности рекомендуется использовать системный cron для вызова wp-cron.php;
  • Поддерживает передачу параметров в callback-функции.

Как написать функцию для удаления старых записей в WordPress

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

function wp8_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); // true — без возможности восстановления
        }
    }
}

Эта функция получает ID всех постов старше 30 дней и удаляет их без перемещения в корзину.

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

Если на вашем сайте используются кастомные типы записей, например event или product, просто измените параметр post_type в $args на нужный вам тип или массив типов:

'post_type' => array('post', 'event', 'product'),

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

Добавляем планировщик WP-Cron для регулярного удаления

Теперь создадим событие WP-Cron, которое будет запускать вышеописанную функцию, например, раз в сутки.

Регистрация кастомного интервала и события

По умолчанию доступны интервалы: hourly, twicedaily, daily. Для наших целей подходит daily. Если нужен кастомный интервал, его можно добавить так:

function wp8_add_cron_interval($schedules) {
    if (!isset($schedules['weekly'])) {
        $schedules['weekly'] = array(
            'interval' => 604800, // 7 дней в секундах
            'display'  => __('Once Weekly'),
        );
    }
    return $schedules;
}
add_filter('cron_schedules', 'wp8_add_cron_interval');

Пример регистрации события и привязки функции:

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

add_action('wp8_delete_old_posts_event', 'wp8_delete_old_posts');

Этот код проверяет, запланировано ли событие, и если нет — создаёт его с интервалом в сутки. Затем связывает событие wp8_delete_old_posts_event с функцией удаления.

Удаление запланированного события при деактивации плагина

Если этот код размещён в плагине, важно отменять расписание при его деактивации:

function wp8_deactivate_plugin() {
    $timestamp = wp_next_scheduled('wp8_delete_old_posts_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp8_delete_old_posts_event');
    }
}
register_deactivation_hook(__FILE__, 'wp8_deactivate_plugin');

Советы по безопасности и оптимизации

Проверяйте права пользователя

Если планируете запускать удаление из админки или через AJAX, добавьте проверки прав, чтобы предотвратить несанкционированное удаление.

Оптимизация запросов

При большом количестве записей настройте постраничный перебор (пагинацию) в запросах, чтобы избежать превышения лимитов памяти и времени выполнения.

Используйте транзакции и логи

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

Альтернативные решения: плагины для автоматизации удаления

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

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

Однако собственный код даёт максимальный контроль и гибкость.

Полный пример: плагин для удаления старых записей

Ниже пример простого плагина, который автоматически удаляет посты старше 30 дней:

<?php
/**
 * Plugin Name: WP8 Auto Delete Old Posts
 * Description: Автоматическое удаление старых записей через WP-Cron
 * Version: 1.0
 * Author: WP8.ru
 */

function wp8_delete_old_posts() {
    $days = 30;
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array('before' => "$days days ago"),
        ),
        '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);
        }
    }
}

function wp8_schedule_old_post_deletion() {
    if (!wp_next_scheduled('wp8_delete_old_posts_event')) {
        wp_schedule_event(time(), 'daily', 'wp8_delete_old_posts_event');
    }
}
add_action('wp', 'wp8_schedule_old_post_deletion');
add_action('wp8_delete_old_posts_event', 'wp8_delete_old_posts');

function wp8_deactivate_plugin() {
    $timestamp = wp_next_scheduled('wp8_delete_old_posts_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp8_delete_old_posts_event');
    }
}
register_deactivation_hook(__FILE__, 'wp8_deactivate_plugin');
?>

Разместите этот код в отдельном файле wp8-auto-delete-old-posts.php, загрузите в папку wp-content/plugins и активируйте через админку WordPress.

Заключение

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

Как использовать WPCommunity для создания социальной сети на WordPress
01.02.2026
Как создать функцию автоматической отправки Email в WordPress с примерами кода
21.03.2026
WooCommerce: автоматическое изменение стоимости товаров по ролям пользователей
07.05.2026
WooCommerce: как автоматически удалять товар из корзины после оплаты
10.06.2026
Как настроить разграничение доступа в WordPress для разных ролей
04.03.2026