Оптимизация базы данных WordPress: удаление старых версий и сбор статистики

Работа с базой данных WordPress — важный этап в поддержании производительности и быстродействия сайта. Со временем в базе накапливаются устаревшие данные: старые ревизии записей, автосохранения, спам-комментарии, а также временные таблицы и мусор. Все это замедляет загрузку страниц и увеличивает нагрузку на сервер.

Почему важно удалять старые версии записей и ревизии

В WordPress каждая запись при редактировании сохраняется в виде ревизии. Это удобно для восстановления информации, но если их много, база разрастается бесполезными данными. На крупных сайтах с сотнями публикаций количество ревизий может достигать тысяч.

Удаление старых ревизий не только освобождает место, но и улучшает скорость запросов к базе. При этом важно сохранять несколько последних версий для безопасности данных.

Для удаления ревизий можно использовать специализированные плагины, например, WP-Optimize или Advanced Database Cleaner. Они позволяют безопасно удалять ревизии, черновики и мусор.

Однако удалять ревизии можно и вручную через запросы к базе. Ниже пример SQL-запроса для удаления всех ревизий, кроме последних двух:

DELETE FROM wp_posts WHERE ID NOT IN (SELECT ID FROM (SELECT MAX(ID) AS ID FROM wp_posts WHERE post_type = 'revision' GROUP BY post_parent ORDER BY ID DESC LIMIT 2) AS temp) AND post_type = 'revision';

Пример функции для удаления ревизий в WordPress (wpacademy)

Если вы хотите автоматизировать процесс через свой плагин или тему, можно использовать PHP-функцию:

function wpacademy_delete_old_revisions() {
    global $wpdb;
    $revisions = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_type = 'revision'");
    foreach ( $revisions as $revision ) {
        wp_delete_post( $revision->ID, true );
    }
}

// Запускаем функцию при активации плагина
register_activation_hook( __FILE__, 'wpacademy_delete_old_revisions' );

Данный код удалит все ревизии. Если нужна более точная логика с сохранением последних версий — стоит доработать функцию с учетом post_parent и даты.

Сбор статистики и анализ состояния базы данных

Для понимания, какие таблицы занимают больше всего места и требуют оптимизации, полезно собирать статистику базы данных. Это помогает выявить «узкие места» и принять решения по очистке.

В WordPress можно получить информацию о размере таблиц с помощью SQL-запроса:

SELECT
  table_name AS 'Таблица',
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS 'Размер (MB)'
FROM information_schema.TABLES
WHERE table_schema = DATABASE()
ORDER BY (data_length + index_length) DESC;

Этот запрос покажет список таблиц и их размер в мегабайтах. Так можно увидеть, например, насколько разрослась таблица wp_postmeta или wp_options.

Для удобства сбора и визуализации статистики есть плагины, например, Query Monitor и WP-DBManager. Они предоставляют отчеты по базам и позволяют выполнять оптимизацию.

Автоматическая оптимизация базы данных с помощью плагина

Рассмотрим пример использования WP-Optimize — популярного плагина для очистки и оптимизации:

  • Устанавливаете и активируете плагин.
  • В разделе WP-Optimize > Database выбираете пункты для очистки: ревизии, спам, мусор, временные опции.
  • Можно настроить автоматическую оптимизацию по расписанию.

Это удобный способ поддерживать базу в чистоте без ручного вмешательства.

Советы по уменьшению размера базы и предупреждению роста мусора

Чтобы база не разрасталась без контроля, рекомендую:

  • Ограничить количество ревизий в файле wp-config.php, добавив строку:
define('WP_POST_REVISIONS', 3); // сохранять не более 3 ревизий
  • Удалять старые черновики и автосохранения через плагины или вручную.
  • Регулярно очищать таблицы transient и временные опции, которые могут накапливаться.
  • Использовать плагин, контролирующий размер и структуру базы.

Например, для удаления устаревших transient можно добавить в файл темы или плагина функцию:

function wpacademy_delete_expired_transients() {
    global $wpdb;
    $time = time();
    $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%' AND option_value < $time" );
}

add_action( 'wp_scheduled_event_hook', 'wpacademy_delete_expired_transients' );

Вызывайте эту функцию по расписанию через WP-Cron, чтобы база не засорялась.

Как настроить автоматическое удаление старого медиафайла в WordPress
23.01.2026
Отзывы с экспертной оценкой в WordPress: настройка и примеры кода
26.12.2025
Как создать и настроить пользовательские роли и права в WordPress
26.01.2026
Как добавить автоматическое удаление старых записей через PHP в WordPress
17.03.2026
Как отключить кэш в WordPress для разработчиков
27.03.2026