В этой статье рассмотрим, как настроить автоматическое удаление устаревших записей в WordPress с помощью CRON-задач. Это полезно, если вы хотите поддерживать базу данных в чистоте и не хранить данные, которые уже не актуальны, например, старые объявления, устаревшие новости или временные записи.
Что такое WPNotes_cron и зачем нужен WP Cron в WordPress
WordPress из коробки имеет встроенную систему планировщика задач – WP Cron. Она запускается при посещении сайта и позволяет выполнять периодические задачи. Однако для автоматического удаления старых записей нужно создать свою задачу, которая будет запускаться, например, ежедневно или еженедельно.
WPNotes_cron – это название функции, которую мы создадим для удаления записей по определённым критериям. Она будет вызываться планировщиком.
Важно понимать, что WP Cron не идеален для сайтов с низкой посещаемостью, так как задачи запускаются при посещении. Для более надёжной работы стоит настроить системный CRON на сервере, который будет вызывать wp-cron.php. Но в большинстве случаев встроенный WP Cron достаточно.
Как зарегистрировать CRON задачу в WordPress
Для начала нам нужно зарегистрировать собственное событие и привязать к нему функцию удаления записей. Добавим следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpnotes_schedule_old_posts_deletion() {
if ( ! wp_next_scheduled( 'wpnotes_daily_old_posts_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpnotes_daily_old_posts_cleanup' );
}
}
add_action( 'wp', 'wpnotes_schedule_old_posts_deletion' );
Здесь мы создаём событие wpnotes_daily_old_posts_cleanup, которое будет запускаться ежедневно.
Функция удаления старых записей: критерии и реализация
Теперь реализуем функцию, которая будет удалять записи старше заданного срока. Например, удалим все записи типа post, которым больше 90 дней.
function wpnotes_delete_old_posts() {
$days_old = 90; // количество дней
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$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 - принудительное удаление без перемещения в корзину
}
}
}
add_action( 'wpnotes_daily_old_posts_cleanup', 'wpnotes_delete_old_posts' );
Обратите внимание, что мы используем хук wpnotes_daily_old_posts_cleanup, который запускает нашу функцию в нужное время.
Особенности и безопасность удаления записей
Удаление происходит принудительно, без помещения в корзину. Это быстро и экономит место, но будьте осторожны, чтобы случайно не удалить важные данные.
Если хотите, можно добавить дополнительные фильтры, например, удалять записи только из определённой категории или с определённым метаполем.
Расширение: удаление старых записей пользовательских типов и с фильтрами
Если у вас на сайте есть кастомные типы записей (CPT), например, events или offers, можете добавить их в список для очистки.
function wpnotes_delete_old_custom_posts() {
$days_old = 60; // для кастомных типов
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$post_types = array( 'events', 'offers' );
foreach ( $post_types as $post_type ) {
$args = array(
'post_type' => $post_type,
'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 );
}
}
}
}
add_action( 'wpnotes_daily_old_posts_cleanup', 'wpnotes_delete_old_custom_posts' );
Также можно фильтровать по метаполям, например, удалять только записи с метаполем expired равным true:
$args['meta_query'] = array(
array(
'key' => 'expired',
'value' => 'true',
),
);
Полезные плагины для мониторинга и управления CRON задачами
Для удобства работы с WP Cron можно использовать плагины, которые показывают расписание задач и позволяют запускать их вручную:
- WP Crontrol — позволяет просматривать, редактировать и запускать задачи WP Cron.
- Clearfy Pro — оптимизационный плагин, в числе функций которого есть расширенное управление WP Cron и очистка базы.
Как проверить, что удаление работает корректно
Чтобы убедиться, что ваша CRON-задача выполняется, можно сделать несколько шагов:
- Установите плагин WP Crontrol и проверьте, что событие
wpnotes_daily_old_posts_cleanupотображается в списке. - Вручную запустите задачу через интерфейс плагина и посмотрите, удалились ли записи.
- Добавьте временный лог в функцию удаления, чтобы записывать время и количество удалённых записей в файл или в системный лог.
Пример добавления логирования
function wpnotes_delete_old_posts() {
$days_old = 90;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$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 );
$count_deleted = 0;
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
if ( wp_delete_post( $post_id, true ) ) {
$count_deleted++;
}
}
}
error_log( "[wpnotes] Deleted $count_deleted old posts on " . date('Y-m-d H:i:s') );
}
add_action( 'wpnotes_daily_old_posts_cleanup', 'wpnotes_delete_old_posts' );
Логи можно смотреть через панель хостинга или с помощью плагинов для просмотра логов.