С течением времени база данных WordPress может значительно разрастаться за счёт накопления ревизий постов. Ревизии — это сохранённые версии записей и страниц, которые WordPress создаёт автоматически при каждом сохранении. Хотя они полезны для отката к предыдущим версиям, большое количество ревизий замедляет работу базы и увеличивает её размер. В этой статье расскажу, как автоматически удалять старые ревизии, сохраняя только последние версии, чтобы оптимизировать работу сайта.
Почему важно удалять старые ревизии в WordPress
Каждая ревизия — это отдельная запись в таблице wp_posts, которая занимает место и увеличивает нагрузку на базу данных при запросах. Особенно актуально для крупных сайтов с сотнями или тысячами записей и частыми правками. Без контроля количество ревизий может вырасти до десятков тысяч, что замедляет админ-панель, увеличивает время отклика сервера и влияет на резервное копирование.
Удаление старых ревизий помогает:
- Снизить размер базы данных.
- Уменьшить нагрузку при выполнении запросов.
- Повысить скорость работы сайта и админ-панели.
- Облегчить резервное копирование и миграцию.
Стандартные способы ограничения ревизий в WordPress
По умолчанию WordPress хранит неограниченное количество ревизий. Чтобы ограничить число ревизий, можно добавить в файл wp-config.php следующую строку:
define('WP_POST_REVISIONS', 5); // Хранить не более 5 ревизий для каждой записиОднако это не удалит уже накопленные ревизии, а лишь ограничит количество новых. Для очистки старых ревизий потребуется отдельное решение.
Автоматическое удаление старых ревизий с помощью кода
Рассмотрим пример функции, которая удаляет все ревизии, кроме последних N, для каждого поста. Код можно добавить в файл functions.php вашей темы или в кастомный плагин.
function wpcontent_delete_old_revisions() {
global $wpdb;
$limit = 5; // Сохранять последние 5 ревизий
// Получаем ID постов с ревизиями
$post_ids = $wpdb->get_col("SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision'");
foreach ($post_ids as $post_id) {
// Получаем все ревизии поста, кроме последних $limit
$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 %d",
$post_id, $limit
));
if (!empty($old_revisions)) {
// Удаляем старые ревизии
foreach ($old_revisions as $revision_id) {
wp_delete_post($revision_id, true);
}
}
}
}
// Запускаем очистку раз в сутки через WP-Cron
if (!wp_next_scheduled('wpcontent_daily_delete_revisions')) {
wp_schedule_event(time(), 'daily', 'wpcontent_daily_delete_revisions');
}
add_action('wpcontent_daily_delete_revisions', 'wpcontent_delete_old_revisions');В этом примере функция wpcontent_delete_old_revisions удаляет все ревизии, кроме 5 последних для каждого поста. Очистка запускается автоматически один раз в день через WP-Cron. Вы можете изменить частоту и лимит ревизий под свои задачи.
Пояснения к коду
Мы используем прямые запросы к базе через $wpdb для эффективного поиска ревизий. Функция wp_delete_post с флагом true удалит пост без возможности восстановления из корзины, что важно для полного удаления ревизий.
Использование плагинов для управления ревизиями
Если не хотите работать с кодом, можно использовать готовые плагины. Вот несколько популярных и проверенных решений:
- WP-Optimize — многофункциональный плагин для очистки базы, включая удаление ревизий, оптимизацию таблиц и кеширование. Подробнее на WPShop.
- Advanced Database Cleaner — удобный инструмент для удаления ревизий, автосохранений и других мусорных данных.
- Delete Revision — простой плагин, который позволяет массово удалить все ревизии одним кликом.
Плагины удобны для быстрого решения, но при большом объёме данных лучше использовать кодовые решения с WP-Cron, чтобы избежать перегрузки сервера.
Оптимизация работы с ревизиями: дополнительные советы
Отключение ревизий для конкретных типов записей
Если на сайте есть кастомные типы записей, для которых ревизии не нужны, можно отключить их, добавив в регистрацию типа аргумент:
'supports' => array('title', 'editor', 'thumbnail'), // без 'revisions'Или программно отключить ревизии для существующих типов:
add_filter('wp_revisions_to_keep', function($num, $post) {
if ($post->post_type === 'my_custom_post_type') {
return 0; // Отключить ревизии
}
return $num;
}, 10, 2);Оптимизация таблиц базы данных
После удаления ревизий рекомендуется выполнить оптимизацию таблиц через phpMyAdmin или с помощью плагина WP-Optimize. Это освободит место и улучшит производительность.
Мониторинг и контроль
Регулярно проверяйте количество ревизий в базе, чтобы вовремя корректировать лимиты или менять частоту очистки. Для этого можно использовать запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';Анализируя динамику, вы сможете подстроить параметры под нагрузку сайта.
Заключение по теме удаления старых ревизий
Автоматическое удаление старых ревизий — важный аспект оптимизации WordPress. С помощью приведённого кода и рекомендаций вы сможете поддерживать базу данных в порядке, улучшить производительность и снизить нагрузку на сервер.
Для удобства и дополнительных функций советую обратить внимание на плагин WP-Optimize, который легко интегрируется и поддерживает комплексную оптимизацию. Подробнее о нём можно узнать на wpshop.ru.