Как автоматически удалять старые ревизии постов в WordPress для оптимизации базы данных

С течением времени база данных 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.

Создать собственный shortcode WordPress: подробное руководство
12.11.2025
Автоматическое удаление заброшенных корзин в WooCommerce по расписанию без плагинов
05.06.2026
Как создать автоматическое удаление неиспользуемых meta данных в WordPress
26.01.2026
Решение проблемы неработающего фильтра товаров WooCommerce по атрибутам
02.06.2026
Как использовать WP-Cron для автоматизации задач в WordPress
04.12.2025