Как автоматизировать удаление старых записей в WordPress через CRON

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

Что такое WP-Cron и зачем он нужен для автоматизации

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

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

Как настроить автоматическое удаление старых записей

Для примера создадим функцию, которая будет удалять записи кастомного типа event, созданные более 180 дней назад. Этот пример можно адаптировать для любых типов записей, включая стандартные post, page и другие.

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

function wppartner_delete_old_events() {
  global $wpdb;
  
  $days = 180; // число дней для хранения записей
  $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

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

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

Регистрация события WP-Cron

Теперь нужно зарегистрировать событие, которое будет регулярно запускать эту функцию. Например, один раз в сутки.

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

add_action('wppartner_daily_old_events_cleanup', 'wppartner_delete_old_events');

Объяснение кода:

  • wppartner_schedule_old_events_deletion проверяет, запланировано ли событие с хук-событием wppartner_daily_old_events_cleanup, если нет — создает планировщик с частотой daily.
  • При срабатывании события вызывается функция wppartner_delete_old_events, которая удаляет старые записи.

Дополнительные настройки и улучшения

Настройка времени запуска

Если нужно запускать задачу не ежедневно, а с другой периодичностью, можно добавить собственный интервал:

function wppartner_custom_cron_schedules($schedules) {
  if (!isset($schedules['weekly'])) {
    $schedules['weekly'] = array(
      'interval' => 604800, // 7 дней в секундах
      'display' => __('Еженедельно')
    );
  }
  return $schedules;
}
add_filter('cron_schedules', 'wppartner_custom_cron_schedules');

После этого в wp_schedule_event можно указать 'weekly'.

Удаление не только записей, но и связанных данных

Иногда необходимо удалять не только посты, но и связанные метаданные или таксономии. В этом случае можно расширить функцию:

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

  $old_posts = $wpdb->get_col($wpdb->prepare(
    "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_date < %s AND post_status IN ('publish', 'draft', 'pending')",
    'event', $date_threshold
  ));

  if (!empty($old_posts)) {
    foreach ($old_posts as $post_id) {
      // Удаляем метаданные
      delete_post_meta($post_id);
      // Удаляем связи с таксономиями
      wp_set_object_terms($post_id, null, 'event_category');
      // Удаляем сам пост
      wp_delete_post($post_id, true);
    }
  }
}

Использование плагинов для управления очисткой базы

Если вы не хотите писать собственный код, существуют плагины, которые помогут с автоматической очисткой:

  • Clearfy Pro — плагин для оптимизации и очистки базы, включая удаление ревизий и устаревших записей.
  • WPRemark — инструмент для автоматизации работы с контентом, который можно настроить и для удаления устаревшего контента.

Однако собственный код даёт максимальный контроль и гибкость под конкретные задачи.

Отладка и мониторинг выполнения WP-Cron

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

Если WP-Cron не срабатывает, возможно, на вашем хостинге стоит системный cron, который отключает внутренний планировщик WordPress. В этом случае настройте запуск wp-cron.php через системный cron вручную.

Итог

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

Вам также может быть интересно:

Как создать динамичные формы в WordPress с помощью Akismet и AJAX
25.11.2025
Как автоматизировать создание и отправку email-рассылок в WordPress
17.04.2026
Создание комплексного фильтра постов WordPress с помощью мета-запросов
09.02.2026
Как изменить структуру ссылок в WordPress без плагинов: практическое руководство
07.04.2026
Как исправить дубли canonical и noindex в WordPress без потери индексации
18.08.2026
×
C Днём программиста!
-20%

Ваша скидка
на премиум-темы и
плагины WordPress

Купить со скидкой сейчас ⋙