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

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

Что такое WP-Cron и зачем он нужен для удаления записей

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

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

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

Первый шаг — написать функцию, которая будет искать записи старше нужного количества дней и удалять их. Рассмотрим пример, который удаляет публикации типа post, старше 90 дней.

function wptest_delete_old_posts() {
    $days = 90; // Возраст записей в днях
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true); // true - удалить без возможности восстановления
        }
    }
}

В этой функции мы используем get_posts с параметром date_query, чтобы получить идентификаторы всех публикаций старше 90 дней, а затем удаляем их через wp_delete_post с принудительным удалением.

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

Далее нужно зарегистрировать событие в WP-Cron, которое будет вызывать функцию wptest_delete_old_posts по расписанию, например, раз в сутки.

Добавим следующий код в файл functions.php вашей темы или в отдельный плагин:

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

add_action('wptest_daily_delete_old_posts', 'wptest_delete_old_posts');

Здесь мы проверяем, есть ли уже запланированное событие с хук-именем wptest_daily_delete_old_posts. Если нет — создаём его с интервалом daily (раз в сутки). Затем привязываем нашу функцию к этому событию.

Как отменить запланированное событие

Если нужно отключить автоматическое удаление, можно отменить событие следующим кодом:

function wptest_clear_scheduled_old_posts_deletion() {
    $timestamp = wp_next_scheduled('wptest_daily_delete_old_posts');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptest_daily_delete_old_posts');
    }
}

Вызовите функцию wptest_clear_scheduled_old_posts_deletion() один раз, например, через админский раздел или плагин для вставки кода, чтобы удалить запланированное событие.

Безопасность и оптимизация

Удаление записей без проверки может привести к потере нужного контента. Чтобы избежать этого, рекомендуем:

  • Фильтровать записи по дополнительным параметрам, например, по категории или пользовательскому полю.
  • Выполнять удаление только опубликованных записей или только определённых типов.
  • Добавлять логирование удалённых записей для контроля.

Пример с фильтрацией по категории «архив»:

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

    $old_posts = get_posts(array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'category_name'  => 'archive',
        'date_query'     => array(
            array('before' => $date),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ));

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true);
    }
}

Использование плагинов для автоматизации удаления старого контента

Если вы предпочитаете использовать готовые решения, обратите внимание на плагины:

  • Auto Delete Posts — позволяет настроить автоматическое удаление записей по дате.
  • WP Bulk Delete — мощный инструмент для массового удаления записей с множеством фильтров.

Оба плагина можно найти на официальном каталоге WordPress.

Для интеграции с плагинами WPSHOP можно использовать Clearfy Pro, который обеспечивает расширенные возможности оптимизации и очистки WordPress.

Итоговые рекомендации

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

Как запретить автозагрузку медиа-содержимого в WordPress для ускорения сайта
27.03.2026
Как оптимизировать загрузку шаблонов WordPress для улучшения производительности
15.01.2026
Как удалить старые вариации товара в WooCommerce
19.04.2026
Как использовать WP Remote Post для отправки данных из WordPress в внешние сервисы
12.12.2025
Как создать меню выпадающего списка в WordPress с помощью PHP и JavaScript
18.12.2025