Поддержание базы данных WordPress в чистоте — важный аспект, влияющий на производительность сайта и скорость работы. Со временем в базе накапливаются устаревшие данные: ревизии, спам-комментарии, временные записи и многое другое. Если регулярно не очищать базу, это может привести к замедлению запросов и увеличению размера бэкапов.
Какие данные считаются устаревшими и почему их стоит удалять
Устаревшими считаются данные, которые больше не нужны для работы сайта или для пользователя и только занимают место в базе. К таким относятся:
- Ревизии записей — WordPress сохраняет каждое изменение записи как отдельную ревизию, что удобно для отката, но быстро накапливается.
- Спам и корзина комментариев — комментарии, отмеченные как спам, и удалённые комментарии не удаляются сразу, а остаются в базе.
- Транзиенты — временные кэшированные данные, которые иногда не удаляются автоматически.
- Автосохранения — временные копии записей, которые тоже занимают место.
- Неиспользуемые метаданные — данные, оставшиеся от удалённых плагинов или тем.
Регулярная очистка базы помогает не только уменьшить её размер, но и повысить скорость работы сайта и админки.
Создание автоматической очистки с помощью WP Cron
Чтобы автоматизировать процесс, можно настроить задачу WP Cron, которая будет запускаться, например, раз в неделю и удалять устаревшие данные.
Шаг 1. Регистрация события cron
Добавим в файл functions.php вашей темы или в собственный плагин код для регистрации события:
function wpexamples_register_weekly_cleanup() {
if ( ! wp_next_scheduled( 'wpexamples_weekly_cleanup_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'wpexamples_weekly_cleanup_hook' );
}
}
add_action( 'wp', 'wpexamples_register_weekly_cleanup' );
Этот код проверяет, запланировано ли уже событие, и если нет — добавляет запуск раз в неделю.
Шаг 2. Создание функции очистки базы
Далее создадим функцию, которая будет удалять устаревшие данные. В качестве примера рассмотрим очистку ревизий, спам-комментариев и транзиентов.
function wpexamples_weekly_cleanup() {
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->comments WHERE comment_approved = 'trash'" );
// Очистка устаревших транзиентов
$expired = $wpdb->get_col(
"SELECT option_name FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()"
);
foreach ( $expired as $transient_timeout ) {
$transient = str_replace( '_transient_timeout_', '', $transient_timeout );
delete_transient( $transient );
}
}
add_action( 'wpexamples_weekly_cleanup_hook', 'wpexamples_weekly_cleanup' );
Этот код удаляет ревизии через прямой SQL-запрос, очищает спам и корзину в комментариях, а также удаляет просроченные транзиенты, вызывая функцию delete_transient.
Как протестировать и отладить очистку базы данных
После добавления кода важно проверить его работу. Для теста можно временно изменить период запуска с weekly на hourly или даже вручную запустить функцию:
do_action('wpexamples_weekly_cleanup_hook');
Также полезно добавить логирование, чтобы фиксировать количество удалённых записей или ошибки. Например, с помощью встроенной функции error_log:
function wpexamples_weekly_cleanup() {
global $wpdb;
$deleted_revisions = $wpdb->query( "DELETE FROM $wpdb->posts WHERE post_type = 'revision'" );
error_log( "[wpexamples] Deleted revisions: " . $deleted_revisions );
$deleted_spam = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam'" );
error_log( "[wpexamples] Deleted spam comments: " . $deleted_spam );
$deleted_trash = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'trash'" );
error_log( "[wpexamples] Deleted trash comments: " . $deleted_trash );
$expired = $wpdb->get_col(
"SELECT option_name FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()"
);
foreach ( $expired as $transient_timeout ) {
$transient = str_replace( '_transient_timeout_', '', $transient_timeout );
delete_transient( $transient );
error_log( "[wpexamples] Deleted transient: " . $transient );
}
}
Логи можно смотреть в файле debug.log, если активирован режим отладки в WordPress.
Использование плагинов для автоматической очистки базы данных
Если вы не хотите писать код, можно использовать специализированные плагины, которые обеспечивают автоматическую очистку базы и оптимизацию:
- Clearfy Pro — мощный плагин для оптимизации и очистки, умеет очищать ревизии, транзиенты, спам и многое другое с автоматическим расписанием;
- WPRemark — плагин для расширенного управления данными и кешем;
- WP-Optimize — бесплатный и популярный плагин для очистки и оптимизации базы данных с возможностью планирования задач.
Использование плагинов особенно удобно для тех, кто не хочет напрямую работать с кодом и SQL-запросами.
Расширенные методы очистки: удаление метаданных и оптимизация таблиц
Кроме основных типов устаревших данных, можно очищать и метаданные, которые остаются от удалённых плагинов и тем. Для этого потребуется более сложный анализ, чтобы избежать удаления нужных данных.
Пример SQL-запроса для удаления неиспользуемых метаданных постов:
DELETE pm FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE p.ID IS NULL;
Этот запрос удалит все метаданные, которые не связаны с существующими записями.
Также полезно периодически оптимизировать таблицы базы данных для уменьшения фрагментации:
function wpexamples_optimize_tables() {
global $wpdb;
$tables = $wpdb->get_col("SHOW TABLES LIKE '{$wpdb->prefix}%'");
foreach ( $tables as $table ) {
$wpdb->query("OPTIMIZE TABLE $table");
}
}
add_action( 'wpexamples_weekly_cleanup_hook', 'wpexamples_optimize_tables' );
Добавление оптимизации в задачу очистки поможет поддерживать базу в хорошем состоянии.
Советы по безопасности и тестированию
Перед использованием любых автоматических очисток обязательно сделайте резервную копию базы данных. Некорректные запросы могут привести к потере данных. Тестируйте на копии сайта или локальном сервере.
Также следите, чтобы очистка не запускалась слишком часто — это может увеличить нагрузку на сервер.