В WordPress при каждом сохранении записи создаются ревизии — версии поста, которые позволяют откатиться к предыдущему состоянию. Это удобно, но со временем количество ревизий растёт, занимая место в базе данных и замедляя работу сайта. Особенно это актуально для сайтов с большим объёмом контента и частыми правками.
Почему важно удалять старые ревизии WordPress
Ревизии накапливаются в таблице wp_posts с типом revision, и при большом числе таких записей база данных становится раздутой. Это приводит к:
- Увеличению размера бэкапов и времени их создания;
- Замедлению запросов к базе данных;
- Росту нагрузки на сервер при выполнении запросов к постам;
- Проблемам с оптимизацией и кэшированием.
Поэтому важно регулярно очищать старые ревизии, оставляя только последние несколько версий для безопасности.
Как автоматически удалять старые ревизии без плагинов
Решение на чистом PHP с использованием WP-Cron позволит запускать регулярную очистку ревизий без участия пользователя. Рассмотрим пример функции, которая удаляет ревизии старше 30 дней, оставляя последние 3 ревизии для каждой записи.
Функция для удаления старых ревизий
function wp_lessons_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) {
// Получаем все ревизии поста, сортируем по дате
$revisions = $wpdb->get_results($wpdb->prepare(
"SELECT ID, post_date FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = 'revision' ORDER BY post_date DESC",
$post_id
));
if (count($revisions) <= 3) {
continue; // Оставляем минимум 3 ревизии
}
$date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));
$to_delete = [];
// Проверяем ревизии старше 30 дней, кроме последних 3
for ($i = 3; $i < count($revisions); $i++) {
if ($revisions[$i]->post_date < $date_limit) {
$to_delete[] = $revisions[$i]->ID;
}
}
if (!empty($to_delete)) {
$ids = implode(',', array_map('intval', $to_delete));
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE ID IN ($ids)");
$wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE post_id IN ($ids)");
}
}
}
Регистрация задачи в WP-Cron
Чтобы функция выполнялась автоматически, добавим её вызов в расписание WP-Cron. Например, запускать раз в сутки.
function wp_lessons_schedule_revision_cleanup() {
if (!wp_next_scheduled('wp_lessons_revision_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wp_lessons_revision_cleanup_event');
}
}
add_action('wp', 'wp_lessons_schedule_revision_cleanup');
add_action('wp_lessons_revision_cleanup_event', 'wp_lessons_delete_old_revisions');
Теперь при запуске WP-Cron раз в день будут удаляться старые ревизии, что поможет поддерживать базу данных в оптимальном состоянии.
Как контролировать количество ревизий, сохраняемых WordPress
Кроме удаления старых ревизий, можно ограничить их количество при сохранении записи. Для этого в файл wp-config.php добавьте строку:
define('WP_POST_REVISIONS', 3);Это ограничит число ревизий до 3. Если значение поставить в false, ревизии не будут сохраняться вообще, но это не рекомендуется, так как теряется возможность отката изменений.
Такое ограничение вместе с регулярной очисткой старых ревизий — оптимальный вариант для контроля над базой данных.
Плагины для управления ревизиями и оптимизации базы
Если не хотите писать код самостоятельно, можно использовать плагины, например:
- Clearfy Pro — позволяет настраивать удаление ревизий, оптимизацию базы и множество других параметров;
- WPRemark — инструмент для очистки базы и управления метаданными.
Но если хотите минимизировать количество плагинов, то использование WP-Cron и собственного кода — лучший путь.
Заключение
Автоматическое удаление старых ревизий в WordPress — обязательная часть оптимизации сайтов с большим количеством контента. Используйте предложенный код и настройте WP-Cron, чтобы сохранить базу данных в чистоте и повысить производительность сайта. Ограничение количества ревизий в wp-config.php дополнительно поможет избежать чрезмерного накопления данных.