Диагностика проблемы: зачем удалять старые записи автоматически?
В проектах с большим количеством контента, например, новостных сайтов, блогов или магазинов на WooCommerce, со временем скапливаются устаревшие записи, которые могут занимать место в базе данных и замедлять работу сайта. Ручное удаление таких записей неудобно и требует времени. Автоматизация процесса поможет поддерживать сайт в чистоте без лишних затрат.
Пошаговое решение: создание задачи WP-Cron для удаления записей
1. Регистрация кастомного события WP-Cron
Добавим функцию, которая будет запускаться по расписанию и удалять записи старше определённого срока.
function wptips_register_cron_event() {
if ( ! wp_next_scheduled( 'wptips_delete_old_posts' ) ) {
// Запускаем событие ежесуточно
wp_schedule_event( time(), 'daily', 'wptips_delete_old_posts' );
}
}
add_action( 'wp', 'wptips_register_cron_event' );2. Создание функции-обработчика для удаления старых записей
Определим функцию, которая удалит записи старше 30 дней. Можно адаптировать под свои потребности.
function wptips_delete_old_posts() {
global $wpdb;
$days = 30;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID записей старше порога
$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 );
}
}
}
add_action( 'wptips_delete_old_posts', 'wptips_delete_old_posts' );3. Очистка задачи при деактивации темы или плагина
Чтобы не оставлять висящие задачи, удалим cron при отключении кода.
function wptips_deactivate_cron() {
$timestamp = wp_next_scheduled( 'wptips_delete_old_posts' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wptips_delete_old_posts' );
}
}
register_deactivation_hook( __FILE__, 'wptips_deactivate_cron' );Проверка результата после внедрения
1. Включите режим отладки WP-Cron, например, с помощью плагина WP Crontrol или через логи.
2. Запустите событие вручную (через WP Crontrol или WP-CLI команду wp cron event run wptips_delete_old_posts).
3. Проверьте, что записи старше 30 дней отсутствуют в админке.
4. Убедитесь, что в базе данных (таблица wp_posts) записи с датой старше порога удалены.
Частые ошибки и как их исправить
- Задача не запускается: Убедитесь, что на сайте есть трафик, иначе WP-Cron не срабатывает. Для теста можно запустить вручную через WP-CLI или плагин WP Crontrol.
- Удаляются не те записи: Проверьте параметры запроса в SQL, особенно условие
post_typeиpost_status. Если нужны другие типы записей, добавьте их в запрос. - Удаление не происходит полностью: Если установлен плагин корзины или кастомное управление удалением, функция
wp_delete_postс параметромtrueгарантирует безвозвратное удаление. - Задача висит после удаления кода: Используйте функцию
wp_unschedule_eventв хуке деактивации.
Практические советы по безопасности и производительности
- Не запускайте удаление очень часто, чтобы не нагружать сервер и базу данных.
- Перед массовым удалением сделайте резервную копию базы данных.
- При большом объёме данных используйте пакетную обработку, чтобы избежать таймаутов (например, удалять по 50-100 записей за один запуск).
- Ограничьте удаление только определёнными типами записей и статусами, чтобы не сломать логику сайта.
- Для контроля можно добавить логирование действий удаления в отдельный файл или таблицу базы данных.
Сравнение способов удаления старых записей
| Способ | Плюсы | Минусы |
|---|---|---|
| WP-Cron с пользовательским кодом | Гибкость, не требует плагинов, точечное управление | Зависит от трафика, требует навыков программирования |
| Плагины для очистки базы (например, WP-Sweep) | Простота использования, множество функций | Может удалять лишнее, нагрузка на базу, не всегда точный контроль |
| Ручное удаление через SQL | Быстро при большом объёме, полный контроль | Опасно без бэкапа, требует знаний SQL |