Как создать функцию автоматического удаления старых записей через WP-Cron в WordPress

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

Что такое WP-Cron и зачем его использовать для автоматизации задач

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

Основные преимущества использования WP-Cron:

  • Простота настройки, не требует доступа к серверу;
  • Гибкость — можно задать любую периодичность;
  • Интеграция с ядром WordPress и плагинами.

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

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

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

Вот пример кода функции с подробными комментариями:

function wpgen_delete_old_posts() {
    // Получаем дату, старше которой записи нужно удалить
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Параметры WP_Query для выборки старых постов
    $args = array(
        'post_type'      => 'post', // Можно заменить на свой тип записи
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'fields'         => 'ids', // Получаем только ID для оптимизации
        'posts_per_page' => -1,
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $post_id) {
            // Безопасное удаление записи
            wp_delete_post($post_id, true); // true — принудительное удаление без корзины
        }
    }
    wp_reset_postdata();
}

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

Регистрация и запуск функции через WP-Cron

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

1. Добавим хук для запуска функции по событию:

add_action('wpgen_delete_old_posts_event', 'wpgen_delete_old_posts');

2. Зарегистрируем периодическое событие при инициализации темы или плагина:

function wpgen_schedule_delete_old_posts() {
    if (!wp_next_scheduled('wpgen_delete_old_posts_event')) {
        // Запускаем задачу один раз в сутки
        wp_schedule_event(time(), 'daily', 'wpgen_delete_old_posts_event');
    }
}
add_action('wp', 'wpgen_schedule_delete_old_posts');

3. Для отмены задачи при деактивации плагина или темы используйте:

function wpgen_unschedule_delete_old_posts() {
    $timestamp = wp_next_scheduled('wpgen_delete_old_posts_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpgen_delete_old_posts_event');
    }
}
// Пример использования при деактивации плагина
register_deactivation_hook(__FILE__, 'wpgen_unschedule_delete_old_posts');

Как проверить и отладить работу WP-Cron задачи

Для диагностики можно использовать плагин WP Crontrol. Он позволяет:

  • Просматривать зарегистрированные задачи WP-Cron;
  • Запускать задачи вручную;
  • Редактировать расписание и параметры задач.

Если ваша задача не запускается, проверьте, что:

  • Событие зарегистрировано и запланировано;
  • На сайт заходят пользователи — WP-Cron запускается при посещении;
  • Нет конфликтов с другими плагинами или темой.

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

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

function wpgen_delete_old_events() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-60 days'));

    $args = array(
        'post_type'      => 'event',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'tax_query' => array(
            array(
                'taxonomy' => 'post_tag',
                'field'    => 'slug',
                'terms'    => 'archived',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
    wp_reset_postdata();
}

Этот код позволит гибко управлять удалением контента, что полезно для поддержания актуальности сайта и экономии места на сервере.

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

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

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

Как создать собственный шорткод в WordPress: пошаговое руководство
06.11.2025
Оптимизация загрузки изображений в WordPress для ускорения сайта
17.12.2025
Как решить проблему: не работает AJAX в WordPress
07.12.2025
Создать динамические формы в WordPress без плагинов
29.11.2025
Как создать собственный REST API endpoint в WordPress с примером кода
31.12.2025