Диагностика проблемы: зачем автоматизировать удаление старого контента
С течением времени WordPress-сайт может накапливать устаревшие или неактуальные записи, что приводит к раздутой базе данных и замедлению работы. Ручное удаление занимает время и часто забывается. Решение — автоматизация процесса с помощью планировщика задач WP-Cron.
Что такое WP-Cron и как он работает
WP-Cron — это встроенный в WordPress механизм для запуска запланированных задач по расписанию. В отличие от системного cron, WP-Cron запускается при посещении сайта, что требует определённой настройки для стабильной работы.
Преимущества использования WP-Cron для удаления записей
- Автоматизация без сторонних плагинов
- Гибкость настройки расписания
- Контроль через код и хуки WordPress
Пошаговое решение: настройка автоматического удаления старых записей через WP-Cron
1. Создание пользовательской функции удаления
Напишем функцию, которая удалит все записи старше определённой даты. Например, удалим записи старше 1 года:
function wporg_delete_old_posts() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));
$old_posts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish' AND post_type = 'post'",
$date_threshold
) );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true ); // true — принудительное удаление без корзины
}
}
}2. Регистрация пользовательского события WP-Cron
Добавим событие, которое будет запускаться ежедневно:
function wporg_schedule_delete_old_posts() {
if ( ! wp_next_scheduled( 'wporg_daily_delete_old_posts' ) ) {
wp_schedule_event( time(), 'daily', 'wporg_daily_delete_old_posts' );
}
}
add_action( 'wp', 'wporg_schedule_delete_old_posts' );
add_action( 'wporg_daily_delete_old_posts', 'wporg_delete_old_posts' );3. Очистка расписания при деактивации темы или плагина
function wporg_clear_delete_old_posts_schedule() {
$timestamp = wp_next_scheduled( 'wporg_daily_delete_old_posts' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wporg_daily_delete_old_posts' );
}
}
register_deactivation_hook( __FILE__, 'wporg_clear_delete_old_posts_schedule' );Проверка результата после внедрения
- Проверьте, что событие запланировано: используйте плагин WP Crontrol или вызовите
wp_next_scheduled('wporg_daily_delete_old_posts')через debugger. - Просмотрите записи на сайте и в базе данных — записи старше года должны удаляться после первого срабатывания.
- Для теста можно временно изменить дату в функции
strtotime('-1 year')на например'-1 day'и проверить удаление ежедневно.
Частые ошибки и как их исправить
- WP-Cron не запускается: WP-Cron срабатывает только при посещении сайта. Чтобы избежать пропуска заданий, настройте системный cron на вызов
wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cronраз в 15 минут. - Удаляются не те записи: проверьте условие SQL-запроса, особенно статус (
post_status) и тип записи (post_type). - Удаление через корзину: в функции
wp_delete_postвторой параметрtrueозначает безвозвратное удаление. Если хотите отправлять записи в корзину, укажитеfalse. - Конфликты с другими плагинами: отключите другие плагины, если задача не срабатывает, чтобы исключить конфликты.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post, а не прямое удаление SQL-запросами, чтобы корректно удалять связанные метаданные и комментарии. - Ограничьте количество удаляемых записей за один запуск, если база очень большая, чтобы избежать превышения времени выполнения.
- Логируйте результаты удаления в отдельный файл для мониторинга выполнения задачи.
- Проверяйте права пользователя, если запускаете удаление через интерфейс или AJAX для безопасности.
Сравнение вариантов автоматического удаления старых записей
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомной функцией | Гибкость, не требует плагинов, точечное удаление | Зависит от посещаемости сайта, требует кода |
| Системный cron с WP-CLI | Надёжно, не зависит от посещений, быстро | Требует SSH-доступа и навыков работы с сервером |
| Плагины (например, WP Optimize) | Простота настройки, дополнительные функции оптимизации | Может быть избыточным, нагрузка на сайт, риск конфликтов |