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

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

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

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

К примеру, можно настроить удаление всех записей типа post старше 30 дней, чтобы поддерживать базу в актуальном состоянии.

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

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

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

function wpbuy_delete_old_posts() {
    $days = 30; // удалять записи старше 30 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date,
                'inclusive' => true,
            ),
        ),
        '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 — удаление без попадания в корзину
        }
    }
}

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

Регистрация и планирование задачи WP-Cron

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

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

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

add_action('wpbuy_delete_old_posts_hook', 'wpbuy_delete_old_posts');

Объяснение:

  • wp_schedule_event — планирует событие с уникальным идентификатором wpbuy_delete_old_posts_hook, которое будет запускаться ежедневно;
  • хук wpbuy_delete_old_posts_hook привязан к функции wpbuy_delete_old_posts;
  • функция wpbuy_schedule_old_posts_deletion проверяет, запланировано ли уже событие, и если нет — создает его;
  • хук wp используется для запуска функции планирования при каждом заходе на сайт.

Как проверить и отладить работу автозапуска

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

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

function wpbuy_delete_old_posts() {
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            error_log('wpbuy: deleting post ID ' . $post_id);
            wp_delete_post($post_id, true);
        }
    }
}

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

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

function wpbuy_delete_old_posts_by_type($post_type = 'post', $days = 30) {
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => $post_type,
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date,
                'inclusive' => true,
            ),
        ),
        '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('wpbuy_delete_old_custom_posts_hook', function() {
    wpbuy_delete_old_posts_by_type('events', 60);
});

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

Итоги и рекомендации по автоматическому удалению записей

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

Для безопасного удаления можно сначала отправлять посты в корзину вместо полного удаления, заменив wp_delete_post($post_id, true); на wp_delete_post($post_id, false);. Также рекомендуем регулярно делать резервные копии базы данных.

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

WooCommerce: как реализовать автосохранение изменений в корзине без перезагрузки страницы
03.10.2026
WooCommerce: как автоматически удалять неактивные варианты товара
03.10.2026
Как добавить автоматическое сохранение данных в формах WordPress
28.09.2026
Как отключить критические остановки WordPress при ошибках плагинов
02.10.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию без плагинов
20.09.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »