Как удалить старые записи в WordPress через cron по условиям

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

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

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

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

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

Можно задать удаление не только по дате, но и по другим условиям — по типу записи, категории, меткам или пользовательским полям.

Как настроить задачу cron для удаления записей

Для начала создадим функцию удаления и зарегистрируем задачу в WP-Cron. Ниже пример, который удаляет записи типа post старше 180 дней.

function wplike_delete_old_posts() {
    global $wpdb;
    $days = 180; // количество дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

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

// Планируем задачу при инициализации
function wplike_schedule_delete_old_posts() {
    if (!wp_next_scheduled('wplike_cron_delete_old_posts')) {
        wp_schedule_event(time(), 'daily', 'wplike_cron_delete_old_posts');
    }
}
add_action('wp', 'wplike_schedule_delete_old_posts');

// Хук для выполнения
add_action('wplike_cron_delete_old_posts', 'wplike_delete_old_posts');

Этот код добавляет ежедневную задачу, которая ищет и удаляет публикации старше 180 дней.

Как изменить условия удаления

Для удаления записей по другим условиям достаточно изменить SQL-запрос или использовать WP_Query. Например, удалить записи определенной категории:

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

    $args = [
        'post_type' => 'post',
        'posts_per_page' => -1,
        'date_query' => [
            [
                'before' => $date,
            ],
        ],
        'category_name' => 'news',
        'fields' => 'ids',
        'post_status' => 'publish',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}

Использование плагина Clearfy Pro для автоматизации

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

В панели Clearfy можно задать условия удаления по типу, дате, статусу и другим параметрам, а также расписание запуска. Это удобно для тех, кто не хочет погружаться в код.

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

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

  • Убедиться, что удаление безвозвратно — используйте wp_delete_post($post_id, true) только если уверены.
  • Тестировать функцию на локальном или тестовом сайте перед запуском на живом проекте.
  • Не перегружать WP-Cron задачами — если удаляется много записей, лучше разбивать на части.
  • Настроить системный cron на сервере для вызова WP-Cron, если трафик низкий, чтобы задачи запускались вовремя.

Пример разбивки удаления на части

Чтобы избежать тайм-аутов, можно удалять по 20 записей за один запуск:

function wplike_delete_old_posts_batch() {
    global $wpdb;
    $days = 180;
    $date = 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_status = %s AND post_date < %s LIMIT 20",
        'post', 'publish', $date
    ));

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}

Такое решение позволит постепенно очищать базу без нагрузки.

Выводы и рекомендации

Удаление старых записей через WP-Cron — эффективный способ поддерживать сайт чистым и быстрым. Важно продумать условия удаления и тестировать решения. Используйте WP_Query или прямые запросы для гибкости. Если не хочется кодить, обратите внимание на Clearfy Pro и другие инструменты из экосистемы WPShop.

Как удалить старые записи в WordPress через cron по условиям
19.02.2026
Как сделать автоматический редирект в WordPress по условиям
14.04.2026
Как добавить дополнительные поля в формы WordPress без плагинов
28.01.2026
WooCommerce: как автоматически обновлять статус заказа при возврате платежа
30.05.2026
Как добавить автоматический отзыв на посты WordPress
16.02.2026