Как использовать 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)Удобный интерфейс, управление задачамиДополнительная нагрузка, не всегда гибкий
Оптимизация базы данных WordPress при больших объемах данных
28.09.2026
Как отключить переадресацию attachment-страниц в WordPress
07.09.2026
Автоматическое удаление неактивных пользователей в WordPress: настройка и примеры кода
27.09.2026
Как удалить все плагины WordPress одним кликом
01.10.2026
Как создать свой шорткод в WordPress с примерами кода
11.09.2026