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

Диагностика задачи: зачем и когда нужно автоматизировать удаление старого контента

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

Перед настройкой автоматического удаления стоит ответить на вопросы:

  • Какой тип записей нужно удалять (записи, страницы, кастомные типы)?
  • По какому критерию — дата создания, дата обновления, статус записи?
  • Нужно ли удалять записи полностью или переводить в черновики/архив?

Как работает WP-Cron и почему он подходит для удаления контента

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

Ограничения WP-Cron

  • Запускается только при посещении сайта (может срабатывать с задержками при низком трафике)
  • Для критичных задач лучше использовать системный cron с вызовом wp-cron.php

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

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

Пример удаления записей типа post, опубликованных более 30 дней назад:

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

    // Получаем ID записей старше $days
    $old_posts = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' AND post_date < %s",
        'post',
        $date
    ));

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

2. Регистрируем событие WP-Cron для ежедневного запуска

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

add_action('wpreset_daily_delete_old_posts', 'wpreset_delete_old_posts');

3. Очистка расписания при деактивации темы или плагина

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

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

  • Проверьте наличие записей старше 30 дней в админке WordPress (Записи - Все записи).
  • Принудительно вызовите функцию удаления, выполнив в функции wpreset_delete_old_posts() вызов вручную или через панель инструментов (например, через WP-CLI).
  • Проверьте базу данных в таблице wp_posts — записи, удовлетворяющие условию, должны быть удалены.
  • Для отладки можно добавить логирование в функцию удаления, например, через error_log().

Частые ошибки и как их исправить

  • WP-Cron не запускается автоматически
    Причина: низкий трафик сайта или отключен wp-cron.php.
    Решение: настроить системный cron или добавить постоянный вызов wp-cron.php через сервер.
  • Удаляются не те записи или записи не удаляются
    Причина: неправильный тип записи, статус или условие даты.
    Решение: проверьте параметры в запросе SELECT, используйте фильтрацию по post_status и post_type.
  • Удаление не учитывает пользовательские типы записей
    Решение: измените параметр post_type в запросе на нужный.
  • Удаление не происходит из-за прав доступа
    Причина: функция вызывается в контексте, где нет прав.
    Решение: убедитесь, что скрипт запускается от имени администратора или cron.

Практические советы по безопасности и производительности

  • Используйте пакетное удаление (например, по 50 записей за один запуск), чтобы избежать тайм-аутов PHP.
  • Не удаляйте записи без резервного копирования базы данных.
  • Перед удалением проверяйте зависимости: медиафайлы, кастомные поля, связанные записи.
  • Для WooCommerce учитывайте, что удаление продуктов может влиять на заказы — лучше сначала переводить товары в статус "черновик".

Варианты реализации: плагин vs. код в functions.php

МетодПлюсыМинусы
Код в functions.phpПолный контроль, нет дополнительного ПОТребует навыков, риск ошибок, нужно тестировать
Плагин (например, WP Crontrol)Удобный интерфейс, управление задачамиДополнительная нагрузка, не всегда гибкий
Как устранить ошибку 429 Too Many Requests в WordPress
13.03.2026
Как автоматизировать удаление старого контента в WordPress по типу записи
15.04.2026
Как удалить или отключить плагин WordPress без доступа к админке
13.01.2026
Как использовать WP-Cron для автоматического удаления старого контента в WordPress
11.05.2026
Как использовать WPReset для быстрого восстановления сайта после обновлений
05.01.2026