Автоматическое удаление старых записей в 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, которые позволяют управлять автоматическими задачами без кода.

Как удалить или изменить slug в WordPress без потери SEO
14.11.2025
Как отключить Emoji в WordPress для ускорения сайта
10.04.2026
Как установить разные версии PHP для WordPress на одном сервере
12.03.2026
Как удалить данные пользователя из базы WordPress без ошибок
19.02.2026
Как создать автоматический импорт продуктов в WooCommerce с примерами кода
13.04.2026