В процессе эксплуатации WordPress-сайта часто возникает необходимость автоматического удаления старых записей, чтобы поддерживать базу данных в актуальном и оптимальном состоянии. Особенно это важно для новостных, блоговых или информационных сайтов, где контент быстро устаревает и потеря актуальности может влиять на производительность и SEO.
Почему важно использовать Cron для удаления старых записей в WordPress
Ручное удаление записей — это неудобно и требует времени. Автоматизация позволяет настроить периодическую чистку без участия администратора. В WordPress есть собственный механизм Cron (WP-Cron), который можно использовать для запуска задач в заданное время или с определённым интервалом.
WP-Cron работает при каждом посещении сайта, что делает его удобным для большинства хостингов и проектов, где нет доступа к системному Cron. Однако для крупных проектов желательно использовать системный Cron для стабильности.
Настройка автоматического удаления через Cron позволяет:
- Своевременно удалять устаревший контент;
- Оптимизировать базу данных;
- Снижать нагрузку на сервер при пиковых посещениях;
- Минимизировать влияние устаревших данных на SEO.
Как реализовать автоматическое удаление старых записей через WPcore Cron
Рассмотрим пример, как создать функцию и привязать её к WP-Cron для удаления записей старше определённого срока (например, 30 дней).
Шаг 1. Создание функции удаления старых записей
function wpcore_delete_old_posts() {
// Определяем дату, старше которой удаляем записи
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
// Получаем ID постов старше даты
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'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 для безвозвратного удаления
}
}
}
Здесь мы используем стандартный WP_Query через get_posts с параметром date_query для выборки записей старше 30 дней. Затем вызываем wp_delete_post с флагом удаления в корзину false (то есть безвозвратно).
Шаг 2. Регистрация задачи в WP-Cron
Добавим задачу в расписание. Проверим, есть ли событие, и если нет — создадим.
function wpcore_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpcore_daily_old_posts_deletion')) {
wp_schedule_event(time(), 'daily', 'wpcore_daily_old_posts_deletion');
}
}
add_action('wp', 'wpcore_schedule_old_posts_deletion');
add_action('wpcore_daily_old_posts_deletion', 'wpcore_delete_old_posts');
Здесь мы регистрируем событие wpcore_daily_old_posts_deletion, которое будет запускаться раз в день и вызывать функцию удаления.
Рекомендации по безопасности и производительности
Удаление большого количества записей за один раз может привести к нагрузке на сервер. Чтобы избежать этого, можно разбивать удаление на порции.
function wpcore_delete_old_posts_chunk() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'fields' => 'ids',
'posts_per_page' => 10, // удаляем по 10 штук за раз
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
И заменить вызов в Cron на wpcore_delete_old_posts_chunk, чтобы удалять постепенно, снижая нагрузку.
Использование плагинов для автоматизации удаления
Если вы не хотите писать код, существуют плагины, позволяющие управлять автоматическим удалением:
- Auto Post Delete — простой плагин для удаления старых записей по расписанию с гибкой настройкой;
- WP Bulk Delete — мощный инструмент для массового удаления постов, страниц и пользователей с фильтрами;
- Clearfy Pro — оптимизационный плагин с функцией удаления мусора, включая устаревшие записи и ревизии. Подробнее на https://wpshop.ru/plugins/clearfy-pro/.
Эти плагины позволяют настроить удаление без программирования, но для кастомных задач лучше использовать собственный код.
Как отключить удаление для определённых категорий или типов записей
Иногда нужно исключить из удаления записи определённых категорий или типов. Для этого добавим параметр category__not_in или post_type в запрос:
$args = array(
'post_type' => array('post', 'custom_post_type'),
'post_status' => 'publish',
'category__not_in' => array(5, 12), // исключаем категории с ID 5 и 12
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'fields' => 'ids',
'posts_per_page' => 10,
);
Таким образом, вы гибко управляете выборкой для удаления.
Заключение
Автоматизация удаления старых записей через WP-Cron — эффективный способ поддерживать чистоту и производительность сайта. Используйте подходящие интервалы и разбивайте удаление на порции, чтобы избежать проблем с нагрузкой. При необходимости можно интегрировать с плагинами, такими как Clearfy Pro, для расширенных возможностей оптимизации.