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

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

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

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

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

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

  • Поддерживать базу данных в чистоте;
  • Уменьшать размер базы и повышать производительность;
  • Избегать ручной работы и ошибок при удалении;
  • Настраивать удаление по разным критериям — дате, категории, статусу и др.

Как создать функцию для удаления старых записей в WordPress

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

function wpmonitor_delete_old_posts() {
    $days = 180; // Срок хранения записей
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Получаем ID записей для удаления
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_posts = get_posts($args);

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
    }
}

Эта функция получает все опубликованные записи старше 180 дней и удаляет их безвозвратно. При необходимости можно модифицировать post_type (например, для кастомных типов записей), добавить фильтрацию по категориям, меткам и другим параметрам.

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

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

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

add_action('wpmonitor_delete_old_posts_hook', 'wpmonitor_delete_old_posts');

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

  • wp_next_scheduled проверяет, не запланировано ли уже событие с таким хуком;
  • Если нет — ставим задачу на ежедневный запуск через wp_schedule_event;
  • При срабатывании события вызывается функция wpmonitor_delete_old_posts.

Этот код можно добавить в файл functions.php вашей темы или в отдельный плагин. Рекомендуется создавать небольшой плагин для таких задач — так проще управлять функционалом.

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

Поскольку WP-Cron запускается при заходе пользователя, для отладки можно:

  • Вручную вызвать функцию wpmonitor_delete_old_posts() через консоль WP-CLI или временно добавить вызов в functions.php;
  • Использовать плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/) для просмотра и ручного запуска задач WP-Cron;
  • Добавить логирование в функцию для записи удаляемых ID в файл или базу данных.

Пример простого логирования:

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

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

    $old_posts = get_posts($args);
    $log = '';

    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true);
        $log .= "Deleted post ID: $post_id\n";
    }

    if ($log) {
        file_put_contents(__DIR__ . '/wpmonitor_deletion.log', $log, FILE_APPEND);
    }
}

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

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

  • Auto Delete Posts — плагин для автоматического удаления записей по разным условиям;
  • Trash Empty Cron — регулярная очистка корзины;
  • Плагин Clearfy — содержит множество инструментов оптимизации базы, возможно, поможет с автоматизацией удаления мета-данных и устаревших записей.

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

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

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

  • Тщательно тестировать функцию удаления, чтобы не потерять важный контент;
  • Добавлять логирование удаления для контроля;
  • Настраивать правильный интервал и критерии удаления, подходящие под ваш проект;
  • Понимать особенности работы WP-Cron и при необходимости настраивать системный cron для надежности.

Такой подход позволит сделать работу сайта более стабильной и эффективной, избавит от рутинных задач и снизит нагрузку на базу данных.

Как отладить проблемы с AJAX в WordPress: практическое руководство
08.03.2026
Как автоматизировать удаление спам-комментариев в WordPress
16.02.2026
Как удалить неиспользуемые мета данные в WordPress для ускорения сайта
20.12.2025
Как автоматизировать удаление старых записей по мета-данным в WordPress
22.01.2026
WooCommerce: как исправить проблему с неотображением цены товара после обновления
31.05.2026