Автоматическое удаление старого контента WordPress по дате публикации

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

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

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

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

  • Какие типы записей нужно удалять? Только записи (post), или страницы (page), или кастомные типы?
  • Через какой период после публикации контент считается устаревшим? Например, старше 2 лет.
  • Нужно ли удалять записи полностью или переводить их в статус «черновик» или «в корзину»?
  • Необходима ли резервная копия перед удалением?

Для проверки текущего состояния выполните SQL-запрос через phpMyAdmin или WP-CLI:

SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 10;

Это покажет самые старые опубликованные записи.

Пошаговое решение: Автоматическое удаление записей по дате с помощью WP-Cron

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

function wpacademy_delete_old_posts() {
    $days = 730; // количество дней, например, 2 года
    $date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));

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

    $old_posts = get_posts($args);

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

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

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

add_action('wpacademy_daily_old_posts_cleanup', 'wpacademy_delete_old_posts');

3. Добавьте код в файл functions.php вашей темы или в собственный плагин.

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

  • Создайте тестовую запись с датой публикации старше порогового значения.
  • Запустите функцию вручную, например, добавив вызов wpacademy_delete_old_posts(); на время проверки.
  • Проверьте, удалена ли запись в админке WordPress и в базе данных.
  • Для проверки планировщика WP-Cron используйте плагин WP Crontrol или WP-CLI команду wp cron event list.

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

  • Не срабатывает WP-Cron: на некоторых хостингах WP-Cron не запускается автоматически. Проверьте, что посещения сайта вызывают cron, или настройте системный cron на вызов wp-cron.php.
  • Удаление не происходит: проверьте, что функция wp_delete_post вызывается с параметром $force_delete = true, иначе записи попадут в корзину и не удалятся полностью.
  • Удаляются не те записи: проверьте параметры post_type и date_query. Возможно, дата записи в базе не соответствует ожиданиям.
  • Производительность: при большом количестве записей удаление может занимать много времени. Разбейте удаление на порции, например, по 100 записей за раз.

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

  • Перед внедрением обязательно сделайте резервную копию базы данных, чтобы избежать потери данных.
  • Реализуйте проверку ролей пользователя, если функция запускается вручную из админки.
  • Для больших сайтов используйте пакетное удаление с пагинацией:
function wpacademy_delete_old_posts_batch() {
    $days = 730;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));

    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => array(
            array('before' => $date_threshold, 'inclusive' => true),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 100,
    );

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
        }
        return true; // Есть еще записи, вызывайте повторно
    }
    return false; // Удаление завершено
}
  • Можно запускать пакетное удаление с интервалом, чтобы избежать таймаута PHP.
  • Если нужно сохранять часть контента, рассмотрите изменение статуса на “черновик” вместо полного удаления.

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

МетодОписаниеПлюсыМинусы
WP-Cron + код в functions.phpАвтоматическое удаление по расписанию через WP-Cron и собственную функциюПолный контроль, нет зависимостей от плагиновЗависит от работы WP-Cron, требует навыков программирования
Плагины удаления контентаГотовые решения с интерфейсом, например, WP Bulk DeleteПростота установки, дополнительные опции фильтрацииДополнительная нагрузка, возможные конфликты, платные функции
Ручное удалениеУдаление через админку или SQL-запросыПростота и точность при малом объемеНе автоматизировано, требует постоянного контроля
Как удалить старые варианты товаров в WooCommerce без плагинов
19.05.2026
Как добавить поддержку JSON-LD в WordPress для SEO
19.12.2025
Как решить проблему: не работает форма обратной связи в WordPress
07.12.2025
Как отладить и решить проблемы с PHP Fatal Errors в WordPress
16.01.2026
Как настроить AJAX в WordPress для динамического обновления контента
18.11.2025