В больших блогах и сайтах на WordPress со временем накапливается огромное количество устаревших записей, которые уже не актуальны и только загромождают базу данных. Ручное удаление таких записей отнимает много времени, а автоматизация этого процесса поможет поддерживать базу в чистоте и улучшить производительность сайта.
Почему важно удалять старые записи в WordPress
С течением времени количество записей увеличивается, что:
- Замедляет работу сайта из-за увеличения запросов к базе данных
- Увеличивает размер бэкапов и время их создания
- Создает сложности при миграции и обновлении
Автоматическое удаление записей старше определённого возраста поможет решить эти проблемы без постоянного ручного вмешательства.
Использование wp_cron для автоматизации удаления
WordPress имеет встроенный планировщик задач — wp_cron. С его помощью можно запускать пользовательские функции по расписанию без необходимости использовать системные CRON задачи на сервере.
Для реализации удаления старых записей нужно зарегистрировать собственное событие, которое будет запускаться, например, раз в день, и удалять посты, которым больше нужного срока.
Регистрация пользовательского события с wp_cron
Первым шагом добавим функцию регистрации события при активации плагина или темы:
function wordpresses_register_delete_old_posts_cron() {
if ( ! wp_next_scheduled( 'wordpresses_delete_old_posts_event' ) ) {
wp_schedule_event( time(), 'daily', 'wordpresses_delete_old_posts_event' );
}
}
register_activation_hook( __FILE__, 'wordpresses_register_delete_old_posts_cron' );Здесь мы проверяем, запланировано ли событие, и если нет — добавляем его с интервалом daily (раз в сутки).
Удаление старых записей — основная функция
Теперь напишем функцию, которая будет удалять записи старше заданного количества дней. Например, удалим все записи старше 180 дней.
function wordpresses_delete_old_posts() {
$days = 180; // количество дней
$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 — принудительное удаление без перемещения в корзину
}
}
}
add_action( 'wordpresses_delete_old_posts_event', 'wordpresses_delete_old_posts' );Данная функция выбирает все опубликованные посты, у которых дата публикации старше 180 дней, и удаляет их безвозвратно.
Как отключить задачу при деактивации плагина
Чтобы избежать накопления ненужных событий в планировщике, нужно удалить задачу при деактивации плагина или смене темы:
function wordpresses_deactivate_delete_old_posts_cron() {
$timestamp = wp_next_scheduled( 'wordpresses_delete_old_posts_event' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wordpresses_delete_old_posts_event' );
}
}
register_deactivation_hook( __FILE__, 'wordpresses_deactivate_delete_old_posts_cron' );Практические советы и безопасность
Перед внедрением автоматического удаления убедитесь, что:
- Создаёте резервные копии базы данных, чтобы иметь возможность восстановить удалённые данные.
- Проверяете функции в тестовой среде, чтобы избежать случайной потери нужного контента.
- При необходимости добавляете дополнительную фильтрацию по категориям или меткам, чтобы удалять только записи из определённых разделов.
Например, чтобы не удалять записи из категории «Новости», можно модифицировать аргументы запроса:
$args['category__not_in'] = array( get_cat_ID('Новости') );Также можно добавить логирование удаляемых записей для контроля:
function wordpresses_delete_old_posts() {
$days = 180;
$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 ) {
error_log( 'Удаляется пост ID: ' . $post_id );
wp_delete_post( $post_id, true );
}
}
}Использование плагинов для расширения возможностей
Если вы не хотите писать код самостоятельно, можно рассмотреть плагины с похожей функциональностью. Например:
- Clearfy Pro — содержит инструменты для очистки базы данных, включая удаление старых записей и ревизий.
- WPRemark — модуль автоматизации комментариев, может быть адаптирован для удаления устаревших материалов.
Однако для точной настройки лучше использовать собственный код или создавать небольшой плагин на его основе.
Заключение
Автоматическое удаление старых записей в WordPress через wp_cron — мощный инструмент для поддержки сайта в оптимальном состоянии. Правильно настроенная задача помогает избежать перегрузки базы данных и упрощает управление контентом. С примерами кода выше вы сможете быстро внедрить это решение на своём сайте wordpresses.ru и поддерживать его чистоту и производительность без лишних затрат времени.