В процессе эксплуатации сайта на WordPress часто возникает необходимость автоматически удалять устаревшие записи, например, старые новости, акции или временный контент. Вручную это делать неудобно и трудозатратно, поэтому оптимальным решением станет автоматизация через WP-Cron — встроенный планировщик задач WordPress.
Что такое WP-Cron и почему он нужен для автоматизации
WP-Cron — это виртуальный планировщик задач, который срабатывает при загрузке любой страницы сайта. Он позволяет запускать функции по расписанию, например, очищать базу, отправлять уведомления или выполнять другие задачи. В отличие от системного cron на сервере, WP-Cron не всегда срабатывает точно в нужное время, но для большинства задач этого достаточно.
Автоматическое удаление старых записей — частая задача, например, для сайтов с временными новостями, акциями или контентом, актуальность которого ограничена по времени.
Создание функции автоматического удаления записей по дате
Для начала создадим пользовательскую функцию, которая будет удалять записи старше заданного количества дней. В примере ниже удаляются записи типа post, которым больше 30 дней.
function wpdigest_delete_old_posts() {
$days = 30; // Срок жизни записей в днях
$date_query = array(
array(
'column' => 'post_date',
'before' => "$days days ago",
),
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => $date_query,
'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 ); // Удаление без перемещения в корзину
}
}
}Эта функция находит все опубликованные записи старше 30 дней и удаляет их безвозвратно (обратите внимание на второй параметр true в wp_delete_post).
Подключение функции к WP-Cron для периодического запуска
Чтобы функция запускалась автоматически, нужно зарегистрировать событие в WP-Cron и привязать к нему нашу функцию.
Добавим код для регистрации хука и планирования задачи:
function wpdigest_schedule_old_posts_deletion() {
if ( ! wp_next_scheduled( 'wpdigest_cron_delete_old_posts' ) ) {
wp_schedule_event( time(), 'daily', 'wpdigest_cron_delete_old_posts' );
}
}
add_action( 'wp', 'wpdigest_schedule_old_posts_deletion' );
add_action( 'wpdigest_cron_delete_old_posts', 'wpdigest_delete_old_posts' );Объяснение:
wpdigest_schedule_old_posts_deletionпроверяет, запланировано ли уже событие с ключомwpdigest_cron_delete_old_posts. Если нет, ставит его на ежедневный запуск.- Хук
wpdigest_cron_delete_old_postsвызывает нашу функциюwpdigest_delete_old_posts.
Этот код нужно добавить в functions.php вашей темы или в отдельный плагин.
Как проверить и отладить работу WP-Cron
WP-Cron срабатывает при загрузке страниц, поэтому если на сайте мало трафика, задачи могут запускаться с задержками. Для проверки и управления планировщиком можно использовать плагин WP Crontrol. Он позволяет просматривать, добавлять, удалять и запускать задачи вручную.
С помощью плагина можно убедиться, что задача wpdigest_cron_delete_old_posts присутствует и запускается по расписанию.
Дополнительные настройки и расширения
Удаление по типам записей и таксономиям
Если на сайте используются кастомные типы записей, их тоже можно очистить, изменив параметр post_type в запросе. Например, для удаления старых событий (event):
'post_type' => 'event'Для более точной фильтрации можно использовать таксономии, например, удалять записи только из определённой категории.
Безопасность и резервные копии
Перед автоматическим удалением рекомендуем настроить регулярное резервное копирование базы — так вы не потеряете важные данные в случае ошибки. Для этого отлично подходит плагин Clearfy Pro, который умеет автоматизировать многие задачи по безопасности и оптимизации.
Логирование удаленных записей
Для контроля можно добавить логирование в нашу функцию удаления:
function wpdigest_delete_old_posts() {
$days = 30;
$date_query = array(
array('column' => 'post_date', 'before' => "$days days ago"),
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => $date_query,
'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( "[wpdigest] Deleted post ID: $post_id" );
}
}
}Логи можно просматривать в файле debug.log, если включить WP_DEBUG_LOG.
Альтернативный способ: системный cron и wp-cli
Если у вас есть доступ к серверу, можно настроить системный cron для запуска WP-CLI команд, например, для удаления старых записей. Это точнее и надежнее, чем WP-Cron, особенно для высоконагруженных сайтов.
Пример команды для удаления постов старше 30 дней через WP-CLI:
wp post delete $(wp post list --post_type=post --post_status=publish --date_query_column=post_date --date_query_before='30 days ago' --format=ids) --forceЭту команду можно поставить в системный cron, например, на ежедневный запуск.
Заключение
Автоматическое удаление старых записей в WordPress через WP-Cron — простое и эффективное решение для поддержки актуальности контента и оптимизации базы данных. Используя приведённые примеры, вы сможете быстро настроить эту функцию под свои нужды.
Для расширения возможностей и безопасности рекомендуем ознакомиться с плагином Clearfy Pro и инструментами управления WP-Cron, такими как WP Crontrol.