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

Проблема: автоматическое удаление устаревшего контента на WordPress

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

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

Диагностика проблемы: как понять, что удаление нужно

  • Проверьте количество постов в статусе trash и draft в админке (Записи > Все записи).
  • Посмотрите размер таблиц wp_posts и wp_postmeta в базе данных через phpMyAdmin.
  • Узнайте количество ревизий, используя SQL-запрос: SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';
  • Если сайт работает медленно, а база разрастается, пора автоматизировать очистку.

Пошаговое решение: создание WP-Cron задачи для удаления старого контента

1. Регистрируем пользовательское событие для очистки

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

Это создаст задачу, которая будет запускаться раз в сутки.

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

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

    // Удаляем посты в статусе trash старше 30 дней
    $old_posts = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'trash' AND post_date < %s",
        $date
    ) );

    foreach ( $old_posts as $post_id ) {
        wp_delete_post( $post_id, true ); // true — принудительное удаление
    }

    // Удаляем черновики старше 30 дней
    $old_drafts = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_date < %s",
        $date
    ) );

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

    // Удаляем ревизии старше 30 дней
    $old_revisions = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_date < %s",
        $date
    ) );

    foreach ( $old_revisions as $post_id ) {
        wp_delete_post( $post_id, true );
    }
}
add_action( 'wp3_cleanup_old_posts_hook', 'wp3_cleanup_old_posts' );

3. Очистка WP-Cron (при необходимости)

Для тестирования можно запустить задачу вручную, например, через WP-CLI:

wp cron event run wp3_cleanup_old_posts_hook

Или временно добавить вызов функции в файл functions.php для проверки:

add_action( 'init', 'wp3_cleanup_old_posts' );

После теста не забудьте убрать этот вызов.

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

  • Проверьте таблицу wp_posts на предмет удалённых записей с помощью SQL-запросов.
  • В админке убедитесь, что количество записей в статусах trash, draft и ревизий уменьшилось.
  • Мониторьте логи ошибок и производительность сайта после внедрения.
  • Для отладки можно добавить логирование в функцию очистки:
function wp3_cleanup_old_posts() {
    // ...
    error_log( 'WP3 Cleanup started' );
    // после удаления
    error_log( 'Deleted ' . count( $old_posts ) . ' trashed posts' );
    error_log( 'Deleted ' . count( $old_drafts ) . ' drafts' );
    error_log( 'Deleted ' . count( $old_revisions ) . ' revisions' );
}

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

  • Задача не запускается: Проверьте, что событие зарегистрировано и активировано. WP-Cron срабатывает при заходе пользователей, если трафика мало — задача может не сработать. Решение: настройте системный cron на сервере для вызова wp-cron.php.
  • Удаление не происходит: Проверьте права пользователя, под которым работает PHP, и возможность удаления записей. Также убедитесь, что форматы дат совпадают с форматом базы данных.
  • Планировщик создает несколько одинаковых задач: Используйте wp_next_scheduled для предотвращения дубликатов (как в примере).
  • Ошибка памяти или таймауты: Ограничьте количество обрабатываемых записей за один запуск или делайте удаление порциями.

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

  • Используйте wp_delete_post($post_id, true) только для окончательного удаления, чтобы избежать накопления мусора.
  • Добавьте проверку прав пользователя, если планируете запускать очистку вручную из админки.
  • Для больших сайтов делайте удаление не за один проход, а по частям, используя offset и limit.
  • Для мониторинга состояния задач удобно интегрировать логирование или уведомления на email.
  • Если необходимо, используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wp3.ru&utm_medium=article&utm_campaign=kak-ispolzovat-wp-cron-dlya-avtomaticheskogo-udalenija-starogo-kontenta-v-wordpress) для расширенной очистки и оптимизации.

Сравнение способов удаления старого контента

МетодПлюсыМинусыПример использования
WP-Cron с кастомным кодомГибко, без плагинов, настраиваемоЗависит от трафика, требует навыков разработкиКак в статье
Плагины очистки (например, WP-Sweep)Простота, готовые функцииМожет замедлять сайт, избыточный функционалУстановка и настройка через админку
Системный cron + WP-CLIНадежно, не зависит от посещенийТребует доступа к серверу и знаний командной строкиwp cron event run wp3_cleanup_old_posts_hook
Как использовать WPRemark для автоматического модерирования комментариев в WordPress
31.12.2025
Как удалить или скрыть класс CSS в WooCommerce корзине
19.12.2025
Оптимизация базы данных WordPress: практические советы и примеры кода
05.11.2025
Как добавить динамическое изменение заголовка страницы в WordPress с примерами кода
09.04.2026
Как правильно использовать AJAX в WordPress для объявлений и форм
07.03.2026