Проблема: автоматическое удаление устаревшего контента на WordPress
Со временем на сайте накапливается много устаревших записей, черновиков или ревизий, которые замедляют работу базы данных и ухудшают производительность. Ручное удаление занимает много времени, а плагины часто перегружают сайт или требуют постоянного вмешательства.
WP-Cron — встроенный в WordPress планировщик задач, который позволяет запускать периодические действия без необходимости создавать системный cron на сервере. Мы рассмотрим, как с помощью WP-Cron автоматически удалять контент старше заданного срока.
Диагностика проблемы: как понять, что удаление нужно
- Проверьте количество постов в статусе
trashиdraftв админке (Записи > Все записи). - Посмотрите размер таблиц
wp_postsиwp_postmetaв базе данных через phpMyAdmin. - Узнайте количество ревизий, используя SQL-запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision'; - Если сайт работает медленно, а база разрастается, пора автоматизировать очистку.
Пошаговое решение: создание WP-Cron задачи для удаления старого контента
1. Регистрируем пользовательское событие для очистки
function wp3_register_cleanup_event() {
if ( ! wp_next_scheduled( 'wp3_cleanup_old_posts_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wp3_cleanup_old_posts_hook' );
}
}
add_action( 'wp', 'wp3_register_cleanup_event' );Это создаст задачу, которая будет запускаться раз в сутки.
2. Создаем функцию для удаления записей старше 30 дней
function wp3_cleanup_old_posts() {
global $wpdb;
$days = 30;
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Удаляем посты в статусе trash старше 30 дней
$old_posts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'trash' AND post_date < %s",
$date
) );
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true ); // true — принудительное удаление
}
// Удаляем черновики старше 30 дней
$old_drafts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_date < %s",
$date
) );
foreach ( $old_drafts as $post_id ) {
wp_delete_post( $post_id, true );
}
// Удаляем ревизии старше 30 дней
$old_revisions = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_date < %s",
$date
) );
foreach ( $old_revisions as $post_id ) {
wp_delete_post( $post_id, true );
}
}
add_action( 'wp3_cleanup_old_posts_hook', 'wp3_cleanup_old_posts' );3. Очистка WP-Cron (при необходимости)
Для тестирования можно запустить задачу вручную, например, через WP-CLI:
wp cron event run wp3_cleanup_old_posts_hookИли временно добавить вызов функции в файл functions.php для проверки:
add_action( 'init', 'wp3_cleanup_old_posts' );После теста не забудьте убрать этот вызов.
Проверка результата после внедрения
- Проверьте таблицу
wp_postsна предмет удалённых записей с помощью SQL-запросов. - В админке убедитесь, что количество записей в статусах trash, draft и ревизий уменьшилось.
- Мониторьте логи ошибок и производительность сайта после внедрения.
- Для отладки можно добавить логирование в функцию очистки:
function wp3_cleanup_old_posts() {
// ...
error_log( 'WP3 Cleanup started' );
// после удаления
error_log( 'Deleted ' . count( $old_posts ) . ' trashed posts' );
error_log( 'Deleted ' . count( $old_drafts ) . ' drafts' );
error_log( 'Deleted ' . count( $old_revisions ) . ' revisions' );
}Частые ошибки и как их исправить
- Задача не запускается: Проверьте, что событие зарегистрировано и активировано. WP-Cron срабатывает при заходе пользователей, если трафика мало — задача может не сработать. Решение: настройте системный cron на сервере для вызова
wp-cron.php. - Удаление не происходит: Проверьте права пользователя, под которым работает PHP, и возможность удаления записей. Также убедитесь, что форматы дат совпадают с форматом базы данных.
- Планировщик создает несколько одинаковых задач: Используйте
wp_next_scheduledдля предотвращения дубликатов (как в примере). - Ошибка памяти или таймауты: Ограничьте количество обрабатываемых записей за один запуск или делайте удаление порциями.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($post_id, true)только для окончательного удаления, чтобы избежать накопления мусора. - Добавьте проверку прав пользователя, если планируете запускать очистку вручную из админки.
- Для больших сайтов делайте удаление не за один проход, а по частям, используя offset и limit.
- Для мониторинга состояния задач удобно интегрировать логирование или уведомления на email.
- Если необходимо, используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wp3.ru&utm_medium=article&utm_campaign=kak-ispolzovat-wp-cron-dlya-avtomaticheskogo-udalenija-starogo-kontenta-v-wordpress) для расширенной очистки и оптимизации.
Сравнение способов удаления старого контента
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| WP-Cron с кастомным кодом | Гибко, без плагинов, настраиваемо | Зависит от трафика, требует навыков разработки | Как в статье |
| Плагины очистки (например, WP-Sweep) | Простота, готовые функции | Может замедлять сайт, избыточный функционал | Установка и настройка через админку |
| Системный cron + WP-CLI | Надежно, не зависит от посещений | Требует доступа к серверу и знаний командной строки | wp cron event run wp3_cleanup_old_posts_hook |