Диагностика проблемы: зачем удалять старые версии записей WordPress
WordPress по умолчанию сохраняет каждое изменение записи как отдельную версию (ревизию). Это удобно для восстановления, но при большом объёме контента приводит к раздуванию базы данных, замедлению сайта и росту размера бэкапов. Особенно актуально для сайтов с частыми правками и большим числом постов.
Чтобы проверить, сколько ревизий хранится, выполните SQL-запрос через phpMyAdmin или wp-cli:
SELECT post_parent, COUNT(*) AS revisions_count FROM wp_posts WHERE post_type = 'revision' GROUP BY post_parent ORDER BY revisions_count DESC LIMIT 20;
Этот запрос покажет 20 записей с максимальным количеством ревизий.
Пошаговое решение: удаляем старые версии записей без потери данных
1. Создание резервной копии
Перед любыми операциями с базой данных обязательно сделайте полный бэкап.
2. Удаление всех ревизий с помощью SQL
Самый быстрый способ - удалить все ревизии напрямую из базы данных:
DELETE FROM wp_posts WHERE post_type = 'revision';
Но это удалит все версии, включая последние. Если нужно оставить определённое количество версий, используйте следующий вариант.
3. Удаление старых ревизий, оставляя последние N
Пример кода на PHP, который удаляет все ревизии, кроме последних трёх каждой записи:
function delete_old_revisions($keep = 3) {
global $wpdb;
$sql = "SELECT ID FROM (
SELECT ID, post_parent,
ROW_NUMBER() OVER (PARTITION BY post_parent ORDER BY post_date DESC) as rn
FROM {$wpdb->posts} WHERE post_type = 'revision'
) t WHERE rn > %d";
$revisions_to_delete = $wpdb->get_col($wpdb->prepare($sql, $keep));
if(!empty($revisions_to_delete)) {
$ids = implode(',', array_map('intval', $revisions_to_delete));
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE ID IN ($ids)");
}
}
add_action('init', function() { delete_old_revisions(3); });
Обратите внимание: функция ROW_NUMBER() поддерживается в MySQL 8+. Для более старых версий нужно использовать альтернативные методы, например, через PHP выборку и фильтрацию.
4. Отключение автоматического сохранения ревизий
Чтобы избежать накопления ревизий в будущем, ограничьте их количество в wp-config.php:
define('WP_POST_REVISIONS', 3);
Либо полностью отключите ревизии (не рекомендуется):
define('WP_POST_REVISIONS', false);
Проверка результата после удаления ревизий
- Повторите SQL-запрос из раздела диагностики, чтобы убедиться, что ревизии удалены или их число ограничено.
- Проверьте размер таблицы
wp_postsи общий размер базы данных, они должны уменьшиться. - Убедитесь, что последние версии ваших записей доступны и корректны в админке.
- Проверьте работу сайта: нет ли ошибок при редактировании записей и сохранении новых версий.
Частые ошибки и как их исправить
- Удаление ревизий не уменьшило размер базы: возможно, таблица
wp_postsне была оптимизирована после удаления. Выполните в phpMyAdmin командуOPTIMIZE TABLE wp_posts;для освобождения места. - Ошибка SQL при использовании
ROW_NUMBER(): версия MySQL ниже 8.0. Используйте обходные пути через PHP или плагины. - Ревизии продолжают накапливаться: пропущено ограничение в
wp-config.phpили оно переопределяется плагинами/темой. Проверьте конфликты. - Потеря нужных версий: всегда делайте бэкап перед удалением, можно сначала экспортировать ревизии через SQL.
Практические советы по безопасности и производительности
- Всегда создавайте резервные копии перед изменением базы данных.
- Используйте WP-CLI для массовых операций, например, для удаления ревизий:
wp post delete $(wp post list --post_type='revision' --format=ids)— быстро и безопасно. - Регулярно оптимизируйте базу данных с помощью плагинов типа Clearfy Pro (ссылка), чтобы удалять мусор и улучшать производительность.
- Ограничение числа ревизий уменьшает нагрузку на базу и ускоряет бэкапы.
- Для крупных сайтов настройте автоматическое удаление старых ревизий через WP-Cron, чтобы поддерживать базу в порядке.
Сравнение способов удаления ревизий в WordPress
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| SQL-запросы | Удаление ревизий напрямую из базы | Очень быстро, полный контроль | Риск ошибок, требует бэкапа, требует прав доступа к базе |
| PHP-скрипты | Удаление с фильтрацией и логикой | Гибко, можно оставить последние версии | Медленнее, требует правильной реализации |
| WP-CLI | Команды в консоли для удаления ревизий | Удобно для разработчиков, быстро | Требует доступа к серверу и WP-CLI |
| Плагины (Clearfy Pro и другие) | Готовые инструменты для очистки базы | Просто использовать, безопасно | Может быть платным, меньше контроля |