Как создать автоматическую очистку базы данных WordPress от устаревших данных

Поддержание базы данных 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' );

Добавление оптимизации в задачу очистки поможет поддерживать базу в хорошем состоянии.

Советы по безопасности и тестированию

Перед использованием любых автоматических очисток обязательно сделайте резервную копию базы данных. Некорректные запросы могут привести к потере данных. Тестируйте на копии сайта или локальном сервере.

Также следите, чтобы очистка не запускалась слишком часто — это может увеличить нагрузку на сервер.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать хук pre_get_posts для тонкой фильтрации записей в WordPress
27.01.2026
Как избежать конфликтов между плагинами в WordPress: практические методы и примеры
03.02.2026
Как сделать автоматический откат обновлений WordPress при ошибках
01.04.2026
WooCommerce: как избежать сбоев при массовом обновлении товаров
06.05.2026
WooCommerce: как использовать хуки для добавления пользовательских полей в корзину
22.04.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше