wp-lessons.ru wordpress WP-Lessons

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

В 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 дополнительно поможет избежать чрезмерного накопления данных.

×
WordPress
ждет обновления!

Забирай -20% на премиум-решения

Темы и плагины ⋙