В работе с WordPress часто возникает задача автоматического удаления устаревших записей. Особенно это важно, если вы ведёте сайт с динамичным контентом, например, новости, акции или события, которые теряют актуальность со временем. В этой статье расскажу, как настроить автоматическое удаление постов по дате и категории с помощью WP-Cron и собственного кода. Это поможет поддерживать базу данных в порядке и избавит вас от ручной работы.
Почему важно автоматизировать удаление старого контента
Со временем на сайте накапливается множество записей, которые перестают быть актуальными. Хранение ненужных постов негативно влияет на производительность сайта, увеличивает размер базы данных и усложняет администрирование. Ручное удаление — затратный и ошибкоопасный процесс.
Автоматизация удаления контента позволяет:
- Сохранять базу данных оптимизированной;
- Поддерживать актуальность сайта;
- Избежать ошибок при ручном удалении;
- Экономить время на рутинных задачах.
Настройка WP-Cron для удаления записей по дате и категории
WP-Cron — встроенный планировщик задач в WordPress. С его помощью можно запускать регулярные события, например, раз в сутки удалять записи старше определённой даты и принадлежащие заданной категории.
Создаем кастомное событие WP-Cron
Для начала зарегистрируем событие, которое будет срабатывать ежедневно.
function wpbe_schedule_old_posts_deletion() {
if ( ! wp_next_scheduled( 'wpbe_daily_delete_old_posts' ) ) {
wp_schedule_event( time(), 'daily', 'wpbe_daily_delete_old_posts' );
}
}
add_action( 'wp', 'wpbe_schedule_old_posts_deletion' );
Этот код проверяет, есть ли уже запланированное событие, и если нет — добавляет его.
Обработка удаления постов по событию
Теперь подпишемся на событие и реализуем функцию удаления.
function wpbe_delete_old_posts_by_date_and_category() {
$days_old = 30; // Удалять записи старше 30 дней
$category_slug = 'news'; // Слаг категории для удаления
$args = array(
'date_query' => array(
array(
'before' => date('Y-m-d', strtotime("-" . $days_old . " days")),
'inclusive' => true,
),
),
'category_name' => $category_slug,
'posts_per_page' => -1,
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
);
$query = new WP_Query( $args );
if ( ! empty( $query->posts ) ) {
foreach ( $query->posts as $post_id ) {
wp_delete_post( $post_id, true ); // true — безвозвратное удаление
}
}
}
add_action( 'wpbe_daily_delete_old_posts', 'wpbe_delete_old_posts_by_date_and_category' );
Здесь мы используем WP_Query с параметром date_query для фильтрации по дате и category_name для выбора категории. Затем удаляем найденные посты безвозвратно.
Дополнительные настройки и рекомендации
Безопасность удаления
Перед удалением советую делать резервные копии сайта и базы данных, чтобы избежать потери важных данных. Можно также вместо wp_delete_post использовать wp_trash_post — тогда посты будут отправлены в корзину, откуда их можно восстановить.
Расширение функционала: удаление по нескольким категориям
Если нужно удалять записи из нескольких категорий, замените параметр category_name на category__in с массивом ID категорий:
$args['category__in'] = array( 3, 7, 15 );
unset( $args['category_name'] );
Управление расписанием WP-Cron при низкой посещаемости
WP-Cron срабатывает при посещении сайта, что может быть нерегулярно. Для точного планирования задач можно отключить WP-Cron и поставить системный cron на сервере. Подробнее: https://wpshop.ru/kak-otklyuchit-wp-cron-v-wordpress/.
Использование плагинов для удаления старого контента
Если вы предпочитаете готовые решения, обратите внимание на плагины:
- WP Bulk Delete — позволяет удалять посты по дате, категории, тегам и другим параметрам с гибкими настройками расписания.
- Advanced Database Cleaner — помогает убирать не только старые записи, но и очищать базу данных от мусора.
- Clearfy Pro — расширяет функционал оптимизации WordPress, включая автоматизацию очистки.
Все эти плагины можно найти и скачать на WPSHOP.RU.
Как отследить работу автоматизации удаления
Чтобы убедиться, что удаление работает, можно добавить логирование в функцию удаления:
function wpbe_delete_old_posts_by_date_and_category() {
$days_old = 30;
$category_slug = 'news';
$args = array(...);
$query = new WP_Query( $args );
if ( ! empty( $query->posts ) ) {
foreach ( $query->posts as $post_id ) {
if ( wp_delete_post( $post_id, true ) ) {
error_log( "[WPBE] Deleted post ID: " . $post_id );
}
}
} else {
error_log( "[WPBE] No posts found for deletion." );
}
}
Логи записываются в файл wp-content/debug.log при включенном WP_DEBUG_LOG. Это поможет отследить работу и устранить проблемы.
Итог
Автоматическое удаление старого контента по дате и категории — важная задача для поддержания сайта в актуальном состоянии и оптимизации базы данных. Используя WP-Cron и кастомный код, вы можете настроить гибкую систему уборки устаревших записей. При необходимости подключайте готовые плагины с расширенными возможностями. Главное — регулярно контролировать процесс и не забывать о резервных копиях.