База данных WordPress со временем накапливает много мусора: ревизии записей, спам-комментарии, транзиенты и ненужные таблицы. Это замедляет работу сайта и увеличивает нагрузку на сервер. В этой статье мы разберём, как оптимизировать базу данных вручную, без плагинов, используя SQL-запросы и собственные функции PHP. Такой подход позволяет точечно и безопасно очищать базу, понимать, что происходит, и не нагружать сайт лишними расширениями.
Почему важно оптимизировать базу данных WordPress
WordPress хранит всё содержимое в базе MySQL или MariaDB: посты, страницы, комментарии, настройки и метаданные. При активном использовании сайта со временем в базе накапливается много лишних данных:
- Ревизии записей — автоматические сохранения, которые создаются при редактировании постов.
- Спам- и удалённые комментарии, которые не нужны, но занимают место.
- Транзиенты — временные данные, которые не всегда вовремя удаляются.
- Оптимизация индексов и сжатие таблиц для ускорения запросов.
Если база раздута, это увеличивает время ответа при загрузке страниц, затрудняет резервное копирование и восстанавливает работу сайта.
Как проверить состояние базы данных в WordPress
Для начала нужно оценить, что именно занимает много места и какие таблицы нуждаются в очистке. Для этого можно использовать панель управления хостингом (phpMyAdmin) или подключиться к базе через консоль MySQL.
Например, чтобы посмотреть размер таблиц, выполните запрос:
SELECT table_name AS 'Таблица', ROUND((data_length + index_length) / 1024 / 1024, 2) AS 'Размер в МБ' FROM information_schema.TABLES WHERE table_schema = 'database_name' ORDER BY (data_length + index_length) DESC;Замените database_name на имя вашей базы. Это даст представление, какие таблицы занимают место.
Удаление ревизий записей вручную
Ревизии — это версии постов, сохраняющиеся автоматически. Их может быть слишком много, особенно если часто редактировать записи. Чтобы удалить все ревизии, выполните SQL-запрос:
DELETE FROM wp_posts WHERE post_type = 'revision';Если префикс таблиц отличается от wp_, замените его на ваш. Такой запрос удалит все ревизии из базы.
Для автоматизации можно создать функцию в файле functions.php вашей темы или в отдельном плагине:
function wpset_delete_post_revisions() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
}
wpset_delete_post_revisions();Вызывать эту функцию нужно только один раз, после чего можно её удалить.
Ограничение количества ревизий для новых постов
Чтобы ревизии не накапливались снова, добавьте в wp-config.php следующую строку:
define('WP_POST_REVISIONS', 3);Это ограничит количество ревизий до трёх на запись.
Очистка спам- и удалённых комментариев
Спам-комментарии и те, что находятся в корзине, также занимают место и влияют на производительность.
Для удаления спам-комментариев выполните запрос:
DELETE FROM wp_comments WHERE comment_approved = 'spam';Для удаления комментариев из корзины:
DELETE FROM wp_comments WHERE comment_approved = 'trash';Также полезно очистить метаданные удалённых комментариев:
DELETE pm FROM wp_commentmeta pm LEFT JOIN wp_comments wpc ON pm.comment_id = wpc.comment_ID WHERE wpc.comment_ID IS NULL;Удаление истёкших транзиентов
Транзиенты — это временные данные, которые хранятся в таблице опций. Они создаются для кеширования и ускорения работы. Иногда старые транзиенты не удаляются автоматически, что создает мусор.
Чтобы удалить все истёкшие транзиенты, используйте такой SQL-запрос:
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%' AND option_name IN (
SELECT option_name FROM (
SELECT option_name FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%'
) AS temp_table
);Для удобства можно написать PHP-функцию, которая удалит все транзиенты:
function wpset_delete_expired_transients() {
global $wpdb;
$time = time();
$transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_%' AND option_value < $time");
foreach ($transients as $transient) {
$key = str_replace('_transient_timeout_', '', $transient);
delete_transient($key);
}
}
wpset_delete_expired_transients();Оптимизация таблиц базы данных
После удаления мусорных данных полезно оптимизировать таблицы, чтобы освободить место и улучшить производительность.
Выполните запрос:
OPTIMIZE TABLE wp_posts, wp_comments, wp_options, wp_postmeta, wp_commentmeta;Если у вас много таблиц, можно оптимизировать все сразу, получив список таблиц через SQL и сгенерировав запрос.
Автоматизация оптимизации с помощью WP-Cron
Чтобы не делать очистку вручную, можно настроить регулярное выполнение функций оптимизации через WP-Cron. Например, добавьте в functions.php:
if (!wp_next_scheduled('wpset_optimize_database_event')) {
wp_schedule_event(time(), 'weekly', 'wpset_optimize_database_event');
}
add_action('wpset_optimize_database_event', 'wpset_optimize_database');
function wpset_optimize_database() {
wpset_delete_post_revisions();
wpset_delete_expired_transients();
// Можно добавить удаление спама, корзины и оптимизацию таблиц с помощью $wpdb->query()
}Это позволит автоматически поддерживать базу в хорошем состоянии.
Заключение: без плагинов — с контролем
Оптимизация базы данных WordPress вручную требует понимания структуры и возможных рисков, но даёт полный контроль и не нагружает сайт сторонним кодом. Используя SQL-запросы и собственные функции, вы сможете эффективно очищать базу, ускорять сайт и уменьшать нагрузку на сервер.
Всегда делайте резервные копии базы данных перед выполнением любых операций удаления или оптимизации, чтобы избежать потери данных.