Как удалить старые версии записей в WordPress через код

WordPress по умолчанию хранит все ревизии (версии) записей и страниц, чтобы вы могли при необходимости откатиться к предыдущей версии. Однако со временем их накопляется очень много, что замедляет работу базы данных и увеличивает её размер. В этой статье мы подробно разберём, как безопасно удалить старые версии записей через код, чтобы оптимизировать производительность сайта.

Почему важно удалять старые версии записей WordPress

Ревизии позволяют отслеживать изменения и откатывать контент к предыдущей версии. Но если ревизии накапливаются слишком активно, они занимают значительное место в базе данных. Особенно это заметно на крупных сайтах с большим количеством публикаций. Большое количество ревизий замедляет запросы к таблице wp_posts и может привести к замедлению админки и фронтенда.

Удаление старых ревизий помогает сократить нагрузку на базу данных и ускорить работу сайта без потери текущего контента. При этом желательно сохранять последние несколько ревизий на случай необходимости отката.

Помимо ручного удаления, можно настроить ограничение количества ревизий для новых записей, чтобы проблема не накапливалась.

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

Для начала полезно узнать, сколько ревизий сейчас хранится в базе данных. Для этого можно воспользоваться запросом в phpMyAdmin или через плагин WP-CLI:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';

Этот запрос покажет общее число ревизий. Если значение слишком большое — пора провести очистку.

Также можно посмотреть, сколько ревизий хранится для конкретной записи, указав её ID:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision' AND post_parent = 123;

Удаление старых ревизий через PHP-код с примером функции

Для безопасного удаления ревизий мы напишем функцию с префиксом wpeasy_, которая удалит все ревизии, кроме последних $keep_last для каждой записи. Это позволит сохранить свежие версии на случай отката.

Вот пример кода, который можно добавить в файл functions.php вашей темы или создать маленький плагин:

function wpeasy_delete_old_revisions( $keep_last = 3 ) {
    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 FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = %d ORDER BY post_date DESC",
            $post_id
        ) );

        if ( count( $revisions ) > $keep_last ) {
            // Получаем ID ревизий, которые нужно удалить (старее последних $keep_last)
            $revisions_to_delete = array_slice( $revisions, $keep_last );
            $ids_to_delete = wp_list_pluck( $revisions_to_delete, 'ID' );

            // Удаляем ревизии
            foreach ( $ids_to_delete as $revision_id ) {
                wp_delete_post( $revision_id, true ); // вторым параметром true для полного удаления
            }
        }
    }
}

// Пример запуска функции
// wpeasy_delete_old_revisions( 3 );

Функция получает все записи с ревизиями, затем для каждой записи оставляет только последние $keep_last ревизии и удаляет остальные. Удаление происходит через wp_delete_post с принудительным удалением из базы.

Рекомендуется запускать эту функцию вручную, например, через WP-CLI или подключать временно на сайте, чтобы избежать нагрузки при регулярном использовании.

Автоматизация удаления старых ревизий с помощью WP-Cron

Если вы хотите регулярно очищать базу от старых ревизий, можно настроить WP-Cron задачу. Например, чтобы запускать очистку раз в неделю:

function wpeasy_schedule_revision_cleanup() {
    if ( ! wp_next_scheduled( 'wpeasy_revision_cleanup_hook' ) ) {
        wp_schedule_event( time(), 'weekly', 'wpeasy_revision_cleanup_hook' );
    }
}
add_action( 'wp', 'wpeasy_schedule_revision_cleanup' );

add_action( 'wpeasy_revision_cleanup_hook', function() {
    wpeasy_delete_old_revisions( 3 );
} );

Этот код добавит в расписание WordPress еженедельную задачу, которая будет удалять все ревизии, кроме трёх последних для каждой записи. Таким образом, вы автоматизируете оптимизацию базы.

Ограничение количества ревизий для новых записей

Чтобы предотвратить повторное накопление большого числа ревизий, можно ограничить их количество с помощью константы WP_POST_REVISIONS. Добавьте в wp-config.php следующую строку:

define( 'WP_POST_REVISIONS', 3 );

Это будет ограничивать хранение не более 3 ревизий для каждой записи. Можно указать любое число, подходящее под нужды вашего сайта.

Если указать false, ревизии будут полностью отключены, но это не рекомендуется, так как теряется возможность отката.

Использование плагинов для управления ревизиями

Если не хотите заниматься кодом, можно использовать плагины для управления ревизиями. Вот несколько проверенных решений:

  • WP Revisions Control — простой плагин для ограничения количества ревизий на уровне записи и типа поста.
  • Optimize Database after Deleting Revisions — удаляет ревизии и оптимизирует базу данных.
  • Clearfy Pro — комплексный плагин для оптимизации WordPress, включая управление ревизиями и очистку базы.

Использование плагинов удобно, если вы не хотите самостоятельно писать код или запускать WP-Cron задачи.

Выводы и рекомендации

Удаление старых версий записей в WordPress — простая, но важная оптимизация, которая поможет ускорить сайт и уменьшить нагрузку на базу данных. Самый гибкий способ — написать свой код для удаления ревизий с сохранением последних версий, как показано выше. Автоматизировать процесс можно через WP-Cron.

Также обязательно ограничивайте количество ревизий для новых записей через WP_POST_REVISIONS или плагин, чтобы избежать повторного накопления.

Если вы хотите комплексных решений по оптимизации и очистке базы, обратите внимание на плагин Clearfy Pro, который добавляет удобные инструменты для этого и многого другого.

Как добавить поле в форму регистрации WordPress с подтверждением email
12.12.2025
Как удалить неиспользуемые метаполя в WordPress
07.04.2026
Отладка медленной загрузки страниц WordPress и оптимизация скриптов
05.03.2026
Автоматическое удаление товаров без продаж в WooCommerce
28.06.2026
Как создать многоуровневую навигацию в WordPress с помощью ABC Pagination
04.01.2026