Ведение сайта на WordPress зачастую подразумевает накопление большого количества записей, которые со временем становятся неактуальными. Автоматическое удаление старых записей — эффективный способ поддерживать базу данных в порядке и экономить место на сервере. В этой статье мы подробно разберём, как реализовать автоматическое удаление постов по дате публикации, используя WP-Cron и собственные функции WordPress.
Что нужно знать о WP-Cron и автоматическом удалении записей
WP-Cron — встроенный в WordPress механизм планировщика задач, который позволяет запускать периодические действия. В отличие от системных cron-задач, он запускается при посещении сайта, что важно учитывать при настройке.
Для автоматического удаления старых записей мы создадим функцию, которая будет искать посты старше заданного периода и удалять их. Затем эта функция будет зарегистрирована в расписании WP-Cron, чтобы запускаться автоматически.
Важно: прежде чем внедрять удаление, обязательно сделайте резервную копию базы данных — так вы обезопасите себя от потери важных данных.
Создание функции для удаления постов старше определённого срока
Ниже пример функции, которая удаляет записи типа post, опубликованные более 90 дней назад. Вы можете изменить параметры под свои нужды.
function wprobot_delete_old_posts() {
// Количество дней для хранения записей
$days = 90;
// Формируем дату, старше которой записи будут удалены
$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);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удалить без перемещения в корзину
}
}
}Эта функция получает все публикации старше 90 дней и удаляет их без возможности восстановления из корзины. Если хотите оставить возможность восстановления — замените true на false.
Регистрация задачи в WP-Cron для автоматического запуска
Чтобы функция запускалась автоматически, её нужно привязать к событию WP-Cron. Для этого сначала добавим собственное расписание (например, раз в сутки), если оно ещё не существует:
function wprobot_add_daily_cron_schedule($schedules) {
if (!isset($schedules['daily'])) {
$schedules['daily'] = array(
'interval' => 86400, // 24 часа в секундах
'display' => __('Once Daily', 'wprobot'),
);
}
return $schedules;
}
add_filter('cron_schedules', 'wprobot_add_daily_cron_schedule');Далее создадим событие, если оно ещё не было создано:
function wprobot_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wprobot_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wprobot_delete_old_posts_hook');
}
}
add_action('wp', 'wprobot_schedule_old_posts_deletion');И теперь привяжем нашу функцию к этому хуку:
add_action('wprobot_delete_old_posts_hook', 'wprobot_delete_old_posts');Таким образом, функция wprobot_delete_old_posts будет запускаться раз в сутки и удалять все записи старше 90 дней.
Дополнительные настройки и расширения
Удаление записей других типов
Если на вашем сайте есть кастомные типы записей, которые тоже нужно очищать, добавьте их в параметр post_type массива аргументов. Например:
'post_type' => array('post', 'custom_type')Так вы сможете удалять записи сразу нескольких типов.
Исключение определённых категорий или записей
Чтобы не удалять записи из определённых категорий, добавьте параметр category__not_in в запрос:
$args['category__not_in'] = array(1, 5); // ID категорий для исключенияЕсли нужно исключить конкретные записи по ID, можно фильтровать массив $old_posts перед удалением.
Использование плагинов для расширенной автоматизации
Если хочется настроить более гибкие условия удаления без кода, рассмотрите плагин Clearfy Pro. Он предлагает расширенные опции оптимизации и очистки базы данных, включая удаление устаревших записей, ревизий и мусора.
Для тех, кто предпочитает код, описанный выше вариант — наиболее лёгкий и прозрачный способ автоматизировать удаление старого контента.
Отладка и безопасность
После внедрения решения обязательно проверьте логи ошибок сервера и работу сайта — удаление должно проходить без сбоев. Рекомендуется тестировать на локальной копии сайта или staging-среде.
Также не забывайте о резервном копировании. Можно использовать плагины или встроенные решения для автоматического создания бэкапов перед выполнением важной задачи.
Выводы
Автоматическое удаление старых записей помогает поддерживать сайт в актуальном состоянии и уменьшает нагрузку на базу данных. Используя WP-Cron и собственные функции WordPress, вы получаете гибкое и надёжное решение без лишних плагинов.
Пример кода можно адаптировать под любые задачи, добавляя фильтры, условия и дополнительную логику. Если нужна мощная оптимизация — советуем посмотреть в сторону Clearfy Pro.