ГлавнаяРазноеКак отключить и удалить все редакции в WordPress

Как отключить и удалить все редакции в WordPress

Редакции (или ревизии) в WordPress существуют уже давно. Они позволяют сохранять резервную копию записи или страницы при каждом изменении, а затем просматривать все версии с возможностью восстановить любую из них.

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

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

Ограничение количества редакций

По умолчанию WordPress хранит все редакции для записей и страниц. Это легко изменить с помощью фильтра wp_revisions_to_keep в вашем плагине, или с помощью константы WP_POST_REVISIONS в файле конфигурации wp-config.php. Например, если нам нужно сохранять только 5 последних версий записей и страниц, наш плагин будет выглядеть так:

/**
 * Plugin Name: My Revisions Config
 */
function my_revisions_to_keep( $revisions ) {
    return 5;
}
add_filter( 'wp_revisions_to_keep', 'my_revisions_to_keep' );

С помощью фильтра можно так же ограничивать редакции в зависимости от типа записи. Например, если нам необходимо 10 редакций для страниц и всего 5 редакций для записей (и других типов), то наш плагин будет выглядеть следующим образом:

function my_revisions_to_keep( $revisions, $post ) {
    if ( 'page' == $post->post_type )
        return 10;
    else
        return 5;
}
add_filter( 'wp_revisions_to_keep', 'my_revisions_to_keep', 10, 2 );

Вы так же можете установить ограничение с помощью директивы WP_POST_REVISIONS в файле конфигурации WordPress wp-config.php, но разделение на типы записей с помощью этого метода уже сделать будет невозможно:

define( 'WP_POST_REVISIONS', 5 );

Как отключить редакции

С помощью этих же методов, вы можете и вовсе отказаться от редакций в WordPress. Для этого необходимо установить нулевое ограничение:

function my_revisions_to_keep( $revisions ) {
    return 0;
}
add_filter( 'wp_revisions_to_keep', 'my_revisions_to_keep' );

Или с помощью файла wp-config.php:

define( 'WP_POST_REVISIONS', 0 );

Обратите внимание, что подобное отключенные редакций не повлияет на уже существующие редакции. Все ревизии которые существовали до момента отключения останутся доступными, а новые редакции при сохранении создаваться не будут. Стоит так же отметить, что автосохранения в WordPress тоже являются редакциями и описанные выше методы их не отключают.

Как удалить все редакции

После того, как вы отключили редакции в WordPress, вы наверняка захотите удалить все созданные ранее редакции из базы данных WordPress. Сделать это легко с помощью пары запросов в MySQL через командную строку или интерфейс phpMyAdmin.

Перед тем, как удалить все редакции, необходимо удалить их мета-данные и таксономию, если они имеются. Сделать это можно с помощью запроса:

DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%');

Похожий запрос для удалении таксономии:

DELETE FROM wp_term_relationships WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%');

И наконец, удалить сами ревизии:

DELETE FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%';

Данный запрос удалит все редакции из базы данных WordPress, за исключением автосохранений. Перед исполнением любых подобных запросов, рекомендуем сделать резервную копию вашей базы данных MySQL.

Советуем так же рассмотреть плагин Revision Control, который позволяет просматривать и удалять редакции в WordPress, а так же предоставляет интерфейс для установления ограничения на количество редакций для записей и страниц.

Если у вас возникли проблемы или вопросы при управлении редакциями в WordPress — оставьте комментарий и мы с радостью вам ответим.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • Есть бесплатный демо-плагин WP Cleanfix (http://wordpress.org/plugins/wp-cleanfix/), который входит в Wpxtreme (https://wpxtre.me). Там очень удобно реализована очистка БД от старой мета-информации и редакций и бог его весть чего, пользуюсь им!

  • Никифор

    Константин, спасибо за статью. скажите, а define( ‘WP_POST_REVISIONS’, 0 ); и define (‘WP_POST_REVISIONS’, false); это не одно и тоже? у меня стоит значение — false, но редакции также создаются! я уже решил, что этот метод не работает и тут наткнулся на вашу статью. может я неправильно вставил? в wp-config.php вставил в самом конце.

    • Никифор, да, в данном случае false и 0 одинаковые. Вставить строку нужно не в самый конец файла wp-config.php а чуть раньше, до строки:

      /* That’s all, stop editing! Happy blogging. */

      Или в русскоязычном варианте:

      /* Это всё, дальше не редактируем. Успехов! */

      В общем до того как исполнится файл wp-settings.php, а вы наверное сразу после него и вставили.

      • Никифор

        да, в самом конце! попробую как вы рекомендуете, спасибо.

  • Andre Commodore

    Константин, в разделе «О проекте» написано, что в Вашем журнале будут статьи о безопасности и ускорении блога. Их пока нет или я их не могу найти? Если нет, то будете ли Вы их писать в ближайшее время? Если будете, то опишите, пожалуйста, настройку плагина BetterWPSecurity. Если это достойный плагин. Или другие лучшие методы защиты и ускорения блога. Спасибо.

    • Смотрите Основы безопасности WordPress и Основы кэширования в WordPress. Конечно же мы планируем писать ещё на данные темы, но если у вас есть конкретные вопросы, вы всегда можете их нам задать :)

      • Andre Commodore

        Спасибо, Константин, за быстрый ответ. Я этого на заметил. А вопрос есть. Как максимально надежно защитить WordPress без плагинов или с минимальным их применением. И если возможно, то как ускорить. Пошагово. Даже если нужно в коде настроек изменения сделать. У Вас блог работает очень быстро. Хочется также.

  • Павел

    В новых версиях WP процедура отключение ревизий изменилась. Изменения нужно производить не в файле wp-config.php, а в файле /wp-includes/default-constants.php найти строчку define(‘WP_POST_REVISIONS’, true); и заменить её define(‘WP_POST_REVISIONS’, false); всё работает проверил на WP 3.8.

    • В новых версиях WordPress ничего не менялось в этом плане. А изменять файлы ядра мы вам не советуем, ведь любые изменения пропадут при следующем же обновлении WordPress.

  • Рафис

    Спасибо, помогло, но тут «Это легко изменить с помощью фильтра wp_revisions_to_keep в вашем плагине, или с помощью константы WP_POST_REVISIONS в файле конфигурации wp-config.php.» во первых непонятно, что за мой плагин, во вторых, не сказано что эту константу надо добавить в файл конфига. У меня например такого параметра не было, пришлось добавить. Но понял это не сразу.

    • Рафис, спасибо за замечания!

      Во первых непонятно, что за мой плагин

      Здесь имеется ввиду ваш собственный плагин, который вы размещаете рядом с другими плагинами в wp-content/plugins и активируете.

  • Виктория

    а можно плиз еще раз для особо одаренных чайников написать в каком конкретно файле в каком конкретно месте что нужно все-таки ДОБАВИТЬ или ИСПРАВИТЬ. Лично я не нашла ни в одном из предложенных файлов такого места с указанными словами (кодами)

    • Виктория, прочитайте текст статьи еще раз. Некоторые изменения касаются конфигурационного файла wp-config.php, а другие относятся к созданию собственного плагина WordPress в директории wp-content/plugins или wp-content/mu-plugins

  • Username

    Большое спасибо за актуальную информацию. Установил плагин и произвёл очистку, всё отработало корректно.

  • Игорь

    А что лучше, отключить ревизии или ограничить?

    • На ваше усмотрение.

    • Я предпочитаю все оставлять. Для этого они собственно и нужны. Как-то негативно повлиять наличие всех редакций вряд ли сможет. Много места занимают? Ну, если на сайте миллионы постов, возможно, все что ниже — вполне в разумных масштабах я думаю. Сервер нагружают? Тоже вряд ли. Да и в принципе он для того и создан, чтобы его нагружали :) Кроме того со всеми редакциями без возможности их удаления можно создать особую роль и пользователи с ней смогут публиковать и менять опубликованные материалы, но не смогу удалять эти материалы и, например, в случае кражи пароля от такого аккаунта, злоумышленники смогут лишь наделать новых редакций, а не стереть контент. Абстрактная и маловероятная ситуация, но все же.

  • Добрый день, Константин

    Эти три запроса к БД еще актуальны? Не очень разбираюсь в SQL ) На локальном сервере запустил эти команды и обратил внимание, что ревизии удаляются, но сама таблица фрагментирется как раз на очищаемое место.

    То есть, например. Ревизий было на 30 мб. Таблица _post очищается и тут же фрагменитируется на это же количество мегабайт. Естественно, я соптимизировал эти таблицы, но возникло сомнение по поводу этих запросов. Или так и должно быть?

    P.S. Блог очень качественный — выделяется на фоне рерайта отрерайчных рерайтеров : )

    • Запросы актуальны, а фрагментация уже на уровне MySQL, а точнее движка для MySQL, например в InnoDB «свободное» пространство никогда с диска не освобождается, но заполняется по мере поступления новых данных.

      • Спасибо.
        И еще один вопрос. Я правильно понимаю, что все эти плагины навроде WP Optimize (которые удаляют эти ревизии) как раз выполняют эти команды?
        Чтобы людей не пугать PHPmyAdmin)

        • Не уверен, мы стараемся держаться по-дальше от таких плагинов :)

          • Ок, спасибо большое.
            Посмотрел ВП-Оптимайз — там у них проблемы были в марте с дырами безопасности.
            Нафиг — лучше врукопашную почистить )

  • Наталия Завьялова

    А как увеличить интервал между автосохранениями и избавиться от старых?

    • Чтобы задать интервал автосохранения, достаточно в wp-config.php (сверху) добавить:
      define( 'AUTOSAVE_INTERVAL', 60 );

  • Julia Nazarova

    Зашла в PhpMyAdmin, но не вижу куда вводить запросы в интерфейсе phpMyAdmin?? Подскажите пожалуйста.. Нашла вкладку «запросы по шаблону», вбила туда в окошко «SQL-запрос к базе данных» все три запроса один за другим. Но на сайте ревизии не исчезли! Посоветуйте пожалуйста где вбивать запросы?