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

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

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

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

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

Автоматизация этого процесса экономит время администратора и исключает человеческий фактор.

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

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

Шаг 1. Создаём функцию удаления старых записей

Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин для кастомного функционала:

function wpacademy_delete_old_posts() {
    $days_to_keep = 365; // количество дней хранения записей
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    // Получаем ID постов старше $days_to_keep дней
    $old_posts = get_posts(array(
        'date_query' => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ));

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

В этом коде мы определяем порог удаления — записи старше 365 дней будут удалены. Можно изменить значение $days_to_keep на любое удобное.

Шаг 2. Регистрируем событие в WP Cron

Теперь нужно создать событие, которое будет запускать функцию wpacademy_delete_old_posts() регулярно, например, раз в сутки. Добавьте следующий код:

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

add_action('wpacademy_daily_delete_old_posts', 'wpacademy_delete_old_posts');

Этот код проверяет, запланировано ли событие, и если нет — создаёт его с интервалом 'daily' (раз в сутки). Функция wpacademy_delete_old_posts вызывается при срабатывании события.

Дополнительные рекомендации и проверка работы

Отладка и логирование удаления

Для контроля процесса полезно добавить логирование. Например, можно записывать в файл количество удалённых записей:

function wpacademy_delete_old_posts() {
    $days_to_keep = 365;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    $old_posts = get_posts(array(
        'date_query' => array(
            array('before' => $date_threshold, 'inclusive' => true),
        ),
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
    ));

    $deleted_count = 0;

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

    error_log("[WPAcademy] Deleted $deleted_count old posts older than $days_to_keep days.");
}

Лог можно смотреть в файле debug.log, если включена отладка WordPress.

Как проверить, что WP Cron работает

WP Cron запускается при посещении сайта, если нет внешнего системного cron. Для теста можно временно уменьшить интервал или вызвать функцию вручную:

add_action('init', function() {
    if (current_user_can('administrator')) {
        wpacademy_delete_old_posts();
        echo 'Old posts deletion triggered';
        exit;
    }
});

Этот код выполнит удаление при заходе администратора на сайт, после чего выведет сообщение и завершит работу.

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

Если не хочется писать код, можно использовать плагины. Однако многие из них перегружены дополнительным функционалом. Рекомендуем обратить внимание на плагины с возможностью кастомных задач WP Cron или оптимизации базы, например:

  • Clearfy Pro — плагин для оптимизации и чистки базы, включая удаление старого контента.
  • Плагины для создания кастомных Cron задач (например, WP Crontrol) — для контроля и отладки своих событий.

Заключение

Автоматическое удаление старых записей через PHP и WP Cron — простой и эффективный способ поддерживать чистоту базы данных WordPress. Такой подход позволяет избежать чрезмерного разрастания контента, ускорить работу сайта и снизить нагрузку на сервер. Используйте представленный код как основу для своих задач и адаптируйте под конкретные требования.

Как создать автопостинг в WordPress с использованием WPRemark
30.01.2026
Как добавить поддержку WebP в WordPress без плагинов для оптимизации сайта
07.04.2026
Как использовать WPCommunity для создания форума на WordPress
05.02.2026
Как отключить и заблокировать регистрацию пользователей в WordPress без плагинов
25.04.2026
Как удалить пустые термины таксономий в WordPress
14.03.2026