Ведение сайта на WordPress часто сопровождается накоплением большого количества устаревших или неактуальных записей, что может замедлять работу сайта и усложнять управление контентом. В этой статье мы рассмотрим, как с помощью встроенной системы планировщика задач WP-Cron настроить автоматическое удаление старых постов, освобождая базу данных и поддерживая сайт в оптимальном состоянии.
Что такое WP-Cron и зачем он нужен для автоматического удаления постов
WP-Cron — это встроенный в WordPress механизм имитации системного cron, который позволяет запускать задачи по расписанию. Он активируется при посещении сайта и выполняет запланированные события.
Использование WP-Cron для удаления старых постов позволяет автоматизировать рутинную задачу, избавляя администратора от необходимости вручную удалять устаревший контент. Это особенно полезно для крупных блогов и новостных сайтов, где появляются ежедневные публикации.
Рассмотрим, как создать пользовательскую задачу, которая будет запускаться, например, раз в сутки и удалять записи старше определённого срока.
Регистрация пользовательского события WP-Cron
Сначала нужно зарегистрировать собственное событие, которое будет запускать функцию удаления:
function wp8_register_delete_old_posts_event() {
if ( ! wp_next_scheduled( 'wp8_delete_old_posts_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wp8_delete_old_posts_daily' );
}
}
add_action( 'wp', 'wp8_register_delete_old_posts_event' );Здесь мы проверяем, запланировано ли уже событие wp8_delete_old_posts_daily, и если нет — добавляем его с периодичностью daily (один раз в сутки).
Создание функции удаления старых постов
Далее добавим функцию, которая будет удалять посты старше, например, 90 дней:
function wp8_delete_old_posts_function() {
global $wpdb;
$days = 90; // количество дней
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Выбираем ID постов, которые старше $days и не в статусе 'trash'
$posts_to_delete = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish'",
$date
) );
if ( ! empty( $posts_to_delete ) ) {
foreach ( $posts_to_delete as $post_id ) {
wp_delete_post( $post_id, true ); // true — удаление без возможности восстановления
}
}
}
add_action( 'wp8_delete_old_posts_daily', 'wp8_delete_old_posts_function' );Здесь мы используем глобальный объект $wpdb для выборки постов, старше 90 дней, и функцию wp_delete_post для их удаления. Параметр true означает полное удаление из базы, без помещения в корзину.
Как проверить и отладить работу автоматического удаления
Для контроля выполнения задач WP-Cron полезно использовать плагины, например, WP Crontrol. Он позволяет просматривать запланированные события, запускать их вручную и удалять при необходимости.
После установки плагина зайдите в раздел «Инструменты» — > «Cron Events» и найдите событие wp8_delete_old_posts_daily. Рекомендуется сначала запустить функцию вручную и проверить, удаляются ли нужные посты.
Также можно дополнительно логировать удаление, чтобы видеть, какие записи были удалены. Для этого добавим запись в файл лога:
function wp8_delete_old_posts_function() {
global $wpdb;
$days = 90;
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$posts_to_delete = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish'",
$date
) );
if ( ! empty( $posts_to_delete ) ) {
foreach ( $posts_to_delete as $post_id ) {
if ( wp_delete_post( $post_id, true ) ) {
error_log( "[WP8] Post ID {$post_id} deleted automatically." );
}
}
}
}Дополнительные советы по безопасности и расширению функционала
Фильтрация по типу записей и категориям
Можно ограничить удаление определёнными типами записей или категориями, добавив соответствующие параметры в SQL-запрос. Например, чтобы удалять только записи типа post из категории «Новости»:
$category_id = 5; // ID категории 'Новости'
$posts_to_delete = $wpdb->get_col( $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON (p.ID = tr.object_id)
INNER JOIN {$wpdb->term_taxonomy} tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
WHERE p.post_date < %s AND p.post_status = 'publish' AND p.post_type = 'post' AND tt.term_id = %d",
$date, $category_id
) );Это позволит более точечно управлять удалением и избежать потери важного контента.
Резервное копирование перед удалением
Перед автоматическим удалением рекомендуется настроить регулярное резервное копирование сайта и базы данных. Для автоматизации можно использовать плагин Backup plugins с возможностью создания бэкапов перед выполнением задач.
Отключение WP-Cron и использование системного cron
WP-Cron запускается при посещении сайта, что не всегда удобно и надежно. Для высоконагруженных сайтов рекомендуется отключать WP-Cron и настраивать системный cron на сервере, вызывающий wp-cron.php с нужной периодичностью:
wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1Это повысит стабильность и точность запуска автоматических задач.
Заключение
Использование WP-Cron для автоматического удаления старых постов — простой и эффективный способ поддерживать порядок в базе данных WordPress и оптимизировать производительность сайта. Правильная настройка расписания, фильтров и резервного копирования позволит избежать потерь и сделать процесс безопасным и удобным.