Что такое WP-Cron и зачем автоматизировать очистку базы данных
WP-Cron — это встроенный в WordPress механизм планировщика задач, который позволяет выполнять определённые действия через заданные интервалы времени. Автоматическая очистка базы данных помогает удалять устаревшие записи, ревизии, спам-комментарии и временные данные, что улучшает производительность сайта и уменьшает размер бэкапов.
Диагностика проблем с базой данных WordPress
Перед автоматизацией очистки полезно определить, насколько загружена база данных и какие типы данных занимают наибольший объём:
- Подключитесь к базе через phpMyAdmin или Adminer.
- Выполните запрос для подсчёта количества ревизий, спам-комментариев и транзиентов:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = 'spam';
SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';Если значения велики (например, тысячи ревизий или спама), имеет смысл настроить периодическую очистку.
Пошаговое решение: создание WP-Cron задачи для очистки базы
1. Добавление функции очистки
Создайте функцию, которая удалит ревизии, спам-комментарии и просроченные транзиенты:
function wpmeta_cleanup_database() {
global $wpdb;
// Удаляем все ревизии
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
// Удаляем спам-комментарии
$wpdb->query("DELETE FROM {$wpdb->comments} WHERE comment_approved = 'spam'");
// Удаляем просроченные транзиенты
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_value < UNIX_TIMESTAMP(NOW())");
}2. Регистрация cron события
Добавьте код для регистрации собственного события, если оно ещё не зарегистрировано:
function wpmeta_schedule_cleanup() {
if ( ! wp_next_scheduled( 'wpmeta_daily_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpmeta_daily_cleanup' );
}
}
add_action( 'wp', 'wpmeta_schedule_cleanup' );3. Привязка функции к событию
add_action( 'wpmeta_daily_cleanup', 'wpmeta_cleanup_database' );4. Удаление задачи при деактивации
Важно очищать cron при деактивации плагина или темы, чтобы не оставлять мусор:
function wpmeta_cleanup_deactivation() {
$timestamp = wp_next_scheduled( 'wpmeta_daily_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpmeta_daily_cleanup' );
}
}
register_deactivation_hook( __FILE__, 'wpmeta_cleanup_deactivation' );Проверка результата после внедрения
Чтобы убедиться, что очистка работает корректно:
- Вручную вызовите функцию
wpmeta_cleanup_database()через временный вызов или WP-CLIwp eval 'wpmeta_cleanup_database();'. - Проверьте количество ревизий и спам-комментариев в базе — они должны уменьшиться.
- Наблюдайте в течение суток — запланированная задача должна сработать автоматически.
- Для отладки можно добавить логирование в функцию, например, записывать время запуска в файл или опцию.
Частые ошибки и как их исправить
- Задача не запускается автоматически: WP-Cron запускается только при посещении сайта. Для критичных задач подключите системный cron и вызов wp-cron.php напрямую.
- Удаляются не те данные: всегда проверяйте SQL-запросы на тестовом сайте, чтобы не удалить важные записи.
- Память или время выполнения превышены: разбейте очистку на части или используйте WP-CLI для запуска вне веб-сервера.
- Неправильное удаление транзиентов: транзиенты хранятся в опциях с именами, начинающимися на
_transient_, но время жизни хранится в отдельном ключе_transient_timeout_. Для корректной очистки используйте WP функции.
Практические советы по оптимизации и безопасности
- Используйте WP функции
delete_transient()для удаления транзиентов, чтобы избежать ошибок. - Для больших сайтов с высокой нагрузкой лучше запускать очистку в ночное время через системный cron.
- Добавьте логирование ошибок и успешных запусков для мониторинга.
- Регулярно оптимизируйте таблицы базы данных с помощью
OPTIMIZE TABLEили плагинов, например Clearfy Pro (https://wpshop.ru/plugins/clearfy).
Сравнение способов очистки базы данных WordPress
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
| WP-Cron с кастомной функцией | Гибкость, не требует плагинов | Зависит от посещаемости сайта | Код из статьи |
| Плагин для очистки базы (например WP-Optimize) | Удобство, графический интерфейс | Дополнительная нагрузка, возможна избыточность | WP-Optimize, WP Rocket |
| Системный cron + WP-CLI | Надёжность, не зависит от трафика | Требует доступа к серверу | cron: 0 3 * * * wp cron event run --due-now |