В процессе редактирования постов и страниц WordPress автоматически сохраняет их версии — ревизии. Это полезная функция, позволяющая откатиться к предыдущему варианту текста, но со временем накопление большого количества ревизий приводит к увеличению размера базы данных и замедлению работы сайта. В этой статье мы подробно разберём, как удалить старые ревизии записей и оптимизировать базу данных WordPress, используя код и плагины, а также познакомимся с лучшими практиками управления ревизиями.
Что такое ревизии в WordPress и почему их нужно контролировать
Ревизии — это автосохранённые версии записей. Каждый раз, когда вы обновляете запись, WordPress сохраняет её копию в таблице wp_posts с типом revision. При активном редактировании количество ревизий может быстро расти — сотни и даже тысячи для крупных сайтов.
Накопление ревизий приводит к следующим проблемам:
- Увеличение размера базы данных, что замедляет запросы и резервное копирование;
- Избыточные данные, которые редко используются;
- Увеличение времени загрузки административной панели, особенно в списках записей.
Поэтому важно периодически удалять старые ревизии и ограничивать их количество.
Удаление старых ревизий через PHP-код
Самый точный способ — написать собственную функцию удаления ревизий. Ниже пример функции wpaction_delete_old_revisions, которая удаляет все ревизии, кроме последних трёх для каждой записи:
function wpaction_delete_old_revisions() {
global $wpdb;
// Получаем ID записей с ревизиями
$post_ids = $wpdb->get_col("SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision'");
foreach ($post_ids as $post_id) {
// Получаем все ревизии для записи, кроме последних 3
$old_revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = %d ORDER BY post_date DESC LIMIT 18446744073709551615 OFFSET 3",
$post_id
));
if (!empty($old_revisions)) {
$ids_string = implode(',', array_map('intval', $old_revisions));
// Удаляем старые ревизии
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE ID IN ($ids_string)");
}
}
}
// Запускаем функцию вручную или по крону
wpaction_delete_old_revisions();
Этот код можно добавить в файл functions.php вашей темы или в отдельный плагин. Чтобы не запускать функцию при каждом запросе, лучше настроить её выполнение по расписанию через WP-Cron.
Автоматизация удаления ревизий через WP-Cron
Добавим задачу, которая будет запускать очистку раз в неделю:
function wpaction_schedule_revision_cleanup() {
if (!wp_next_scheduled('wpaction_revision_cleanup_hook')) {
wp_schedule_event(time(), 'weekly', 'wpaction_revision_cleanup_hook');
}
}
add_action('wp', 'wpaction_schedule_revision_cleanup');
add_action('wpaction_revision_cleanup_hook', 'wpaction_delete_old_revisions');
Так вы избавитесь от ручного запуска и сможете регулярно поддерживать базу данных в оптимальном состоянии.
Ограничение количества ревизий при сохранении записи
Чтобы ревизии не разрастались бесконтрольно, можно ограничить их число с помощью константы WP_POST_REVISIONS. Добавьте в wp-config.php строку:
define('WP_POST_REVISIONS', 3);
Это позволит сохранять максимум три ревизии на запись. Старые ревизии будут автоматически удаляться при сохранении новых. Такое ограничение помогает избежать накопления мусора в базе.
Использование плагинов для управления ревизиями
Если вы не хотите работать с кодом, можно использовать надёжные плагины:
- Clearfy Pro — в этом плагине есть модуль для управления ревизиями и оптимизации базы данных. Он позволяет быстро удалить все ревизии и настроить лимит их количества.
Подробнее о Clearfy Pro - WP-Optimize — популярный плагин для очистки и оптимизации базы данных, в том числе удаления ревизий.
- Revision Control — плагин для гибкой настройки количества ревизий и их удаления.
Оптимизация базы данных после удаления ревизий
После удаления ревизий таблица wp_posts остаётся фрагментированной, что снижает производительность. Для восстановления оптимальной работы рекомендуется выполнить оптимизацию таблиц базы данных.
Выполнить это можно вручную через phpMyAdmin, выполнив SQL-запрос:
OPTIMIZE TABLE wp_posts;
Или программно через PHP:
function wpaction_optimize_posts_table() {
global $wpdb;
$wpdb->query('OPTIMIZE TABLE ' . $wpdb->posts);
}
wpaction_optimize_posts_table();
Также многие плагины для оптимизации базы данных выполняют эту операцию автоматически.
Заключение по теме управления ревизиями в WordPress
Удаление старых ревизий и ограничение их количества — важный элемент оптимизации сайта на WordPress. Это помогает уменьшить размер базы данных, повысить скорость работы и улучшить стабильность. Используйте приведённые выше методы: автоматизированное удаление через WP-Cron, ограничение числа ревизий в wp-config.php и плагины Clearfy Pro или WP-Optimize для удобства и безопасности.
Регулярная очистка и оптимизация базы данных — залог быстрого и надёжного сайта без лишнего мусора.