Ведение сайта на WordPress часто сопровождается накоплением большого количества устаревших записей, которые уже не актуальны и загромождают базу данных. Автоматическое удаление старого контента по дате публикации помогает поддерживать базу данных в порядке и улучшать производительность сайта. В этой статье я подробно расскажу, как реализовать такую автоматизацию с помощью кода и плагинов.
Почему важно удалять старый контент
С течением времени многие записи на сайте становятся неактуальными. Они могут занимать место в базе данных, замедлять работу сайта и мешать пользователям находить свежую информацию. Особенно это актуально для сайтов с новостями, акциями или временными предложениями.
Удаление старого контента помогает:
- Оптимизировать базу данных и уменьшить её размер.
- Ускорить загрузку страниц.
- Поддерживать актуальность контента для посетителей.
- Снизить риски безопасности, связанные с устаревшим контентом.
Как определить, какой контент удалять
Чаще всего ориентируются на дату публикации. Например, удалять записи старше 1 года или 6 месяцев. Можно также учитывать статус публикации и тип записи (пост, страница, кастомный тип записи).
Для точного контроля полезно создавать фильтры по дате, статусу и типу записи.
Реализация автоматического удаления через WP-Cron
WP-Cron позволяет запускать задачи по расписанию. Мы создадим функцию, которая будет удалять записи старше определённой даты, и настроим её на ежедневный вызов.
Код для удаления записей старше 6 месяцев
function wp1_delete_old_posts() {
$args = array(
'date_query' => array(
array(
'before' => '6 months ago',
'inclusive' => true,
),
),
'post_type' => 'post',
'post_status' => 'publish',
'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 — без помещения в корзину
}
}
}
function wp1_schedule_delete_old_posts() {
if (!wp_next_scheduled('wp1_daily_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wp1_daily_delete_old_posts_hook');
}
}
add_action('wp', 'wp1_schedule_delete_old_posts');
add_action('wp1_daily_delete_old_posts_hook', 'wp1_delete_old_posts');
Этот код необходимо добавить в файл functions.php вашей темы или в отдельный плагин. Он создаст ежедневное событие, которое будет удалять все опубликованные записи старше 6 месяцев без помещения в корзину.
Как проверить работу и отладить
Чтобы убедиться, что задача выполняется, можно добавить логирование:
function wp1_delete_old_posts() {
$args = array(
'date_query' => array(
array('before' => '6 months ago', 'inclusive' => true),
),
'post_type' => 'post',
'post_status' => 'publish',
'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);
error_log('wp1: удалена запись ID ' . $post_id);
}
} else {
error_log('wp1: старый контент не найден');
}
}
Логи можно смотреть в файле wp-content/debug.log, если включен WP_DEBUG и WP_DEBUG_LOG.
Использование готовых плагинов для удаления старого контента
Если вы не хотите писать код, можно использовать плагины. Рекомендую:
- Auto Delete Posts — позволяет настроить удаление по дате, статусу, категории.
- Advanced Post Cleanup — расширенные фильтры для очистки контента.
Установка и настройка обычно просты: выбираете критерии удаления и периодичность.
Дополнительные советы по безопасности и производительности
Перед автоматическим удалением всегда делайте резервные копии базы данных. Для этого можно использовать плагины, например, Backup от WPSHOP.
Также стоит учитывать, что массовое удаление большого количества записей за одну операцию может нагружать сервер. Если у вас много контента, рекомендуют делать удаление партиями.
Пример удаления партиями по 50 записей
function wp1_delete_old_posts_batch($batch_size = 50) {
$args = array(
'date_query' => array(
array('before' => '6 months ago', 'inclusive' => true),
),
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => $batch_size,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
error_log('wp1: удалена запись ID ' . $post_id);
}
}
}
Такой подход снижает нагрузку, а задачу можно запускать чаще.
Выводы и рекомендации
Автоматизация удаления старого контента — полезная практика для сайтов с динамичным наполнением. Используйте WP-Cron для регулярного запуска, обязательно тестируйте код на тестовом сайте и делайте резервные копии. Если не хотите писать код, подключайте специализированные плагины.
Для расширенных возможностей управления контентом советую обратить внимание на плагин Clearfy Pro от WPSHOP, который содержит инструменты для оптимизации и очистки базы данных.