Ревизии (редакции, изменения) поста

Ревизии это версии контента, создаваемые при обновлении записи (поста) и при авто-сохранении.

Общая информация

В WP есть Авто-черновики - это записи, которые создаются автоматически при открытии страницы создания записи - в этот момент создается авто-черновик - post_status = auto-draft и при первом сохранении становится обычным черновиком - post_status = draft.

Такой черновик не является ревизией - это техническая запись для временного хранения данных до первого сохранения.

Есть два вида ревизий:

  • Ревизии — создаются при сохранении поста, если в контенте (или других значимых полях) есть изменения.

  • Авто-сохранения — создается раз в 60 сек в редакторе (одно на пользователя).

Ревизии хранятся как отдельные записи в таблице wp_posts с post_type = 'revision' и post_status = inherit.

Ревизии связываются с исходным постом через поле post_parent.

В мультисайт константа в wp-config.php действует на всю сеть, ревизии хранятся отдельно в таблицах каждого сайта.

Существует миф, что отключение ревизий ускоряет сайт. На фронтенде ревизии не участвуют в запросах - прироста скорости не будет. Рост только в объеме БД.

Важные поля в таблице wp_posts

Ревизии:

post_type   = revision
post_status = inherit
post_parent = 123
post_name   = 123-revision-v1
post_date   = 2025-03-13 08:24:05

post_name = {parent_post_id}-revision-v1, где v1 - тут это версия системы ревизий.

Пример:

+-------+-----------+-------------+-------------+-------------+---------------------+
| ID    | post_type | post_status | post_parent | post_author | post_date           |
+-------+-----------+-------------+-------------+-------------+---------------------+
| 14385 | revision  | inherit     |       14332 |           1 | 2024-08-24 13:00:39 |
| 14393 | revision  | inherit     |       14384 |           1 | 2024-08-24 13:24:23 |
| 14394 | revision  | inherit     |       14384 |           1 | 2024-08-24 13:24:39 |
+-------+-----------+-------------+-------------+-------------+---------------------+

Автосохранения:

post_type   = revision
post_status = inherit
post_parent = 123
post_name   = 123-autosave-v1
post_date   = 2025-03-13 08:24:05

post_name = {parent_post_id}-autosave-v1, где v1 это версия системы ревизий.

Пример:

+-------+-----------+-------------+-------------+-------------+---------------------+
| ID    | post_type | post_status | post_parent | post_author | post_date           |
+-------+-----------+-------------+-------------+-------------+---------------------+
| 14722 | revision  | inherit     |       14139 |          11 | 2024-10-16 09:51:11 |
| 58093 | revision  | inherit     |       54997 |           1 | 2025-03-13 08:24:05 |
+-------+-----------+-------------+-------------+-------------+---------------------+

Ревизии (классические)

Ревизия создается при сохранении, если есть изменения в значимых полях (post_title, post_content, post_excerpt). Значимые поля определяются функцией _wp_post_revision_data() и изменить их можно через хук _wp_post_revision_fields.

По умолчанию, ревизии создабтся функцией wp_save_post_revision(), которая висит на хуке post_updated:

add_action( 'post_updated', 'wp_save_post_revision', 10, 1 );

Проверку изменился пост или нет (нужно добавить ревизию или нет) можно скорректировать фильтром wp_save_post_revision_post_has_changed

Автосохранения

Автосохранения - это отдельный вид ревизий, который ядро создаёт/распознаёт как автосохранение и обрабатывает иначе.

Отличаются они по полю post_name. Форматы значений этого поля:

// автосохранения
{parent_post_id}-autosave-v1

// ревизий
{parent_post_id}-revision-v1

Продробнее смотрите:

Лимит WP_POST_REVISIONS не распространяется на Автохосранения.

Интервал автосохранения

Автосохранение создается примерно раз в 60 сек в редакторе. По одному актуальному автосохранению на пользователя для каждой записи.

В wp-config.php есть константа AUTOSAVE_INTERVAL:

define( 'AUTOSAVE_INTERVAL', 60 ); // секунды

0 - отключит автосохранения.

Комментарии, таксономии и метаполя у ревизий

По умолчанию в ревизиях не осхраняются никакие данные, кроме некоторых данных из таблицы wp_posts. Т.е:

  • Таксономии - нет.
  • Комментарии - нет.
  • Метаполя - нет (по умолчанию). Но технически можно навесить, но ядро их не создаёт, не копирует из родителя и не восстанавливает при откате. См. _wp_post_revision_fields()

Как отключить/ограничить ревизии

Глобально через wp-config.php:

define( 'WP_POST_REVISIONS', true );  // безлимитно
define( 'WP_POST_REVISIONS', 10 );    // хранить не более 10
define( 'WP_POST_REVISIONS', false ); // отключить ревизии (autosave остается)

Для отдельного поста:

Отключить поддержку revision в массве supports в register_post_type().

Или после регистрации:

add_action( 'init', function() {
	remove_post_type_support( 'promo', 'revisions' );
} );

Или через фильтр:

add_filter( 'wp_revisions_to_keep', 'change_revisions_limit', 10, 2 );
function change_revisions_limit( $num, $post ) {
	if ( 'news' === $post->post_type ) {
		return 0; // отключить
	}

	if ( 'page' === $post->post_type ) {
		return 5; // лимит
	}

	return $num;
}

Как включить ревизии для типов записей

Включить поддержку в register_post_type():

register_post_type( 'news', [
	'supports' => [ 'title', 'editor', 'revisions' ],
] );

Или после регистрации:

add_action( 'init', function() {
	add_post_type_support( 'product', 'revisions' );
} );

Функции и хуки

Функция Описание
wp_revisions_enabled() Проверят, включены ли ревизии (редакции) для указанной записи.
wp_is_post_autosave() Определяет является ли указанная запись авто-сохранением.
wp_delete_post_revision() Удаляет ревизию записи по ID.
wp_revisions_to_keep() Определяет сколько последних ревизий (изменений) следует хранить в базе данных для конкретной записи (поста).
wp_get_post_revisions() Получает все ревизии (редакции, изменения) указанной записи (поста).
wp_get_post_autosave() Retrieves the autosaved data of the specified post.
wp_restore_post_revision() Restores a post to the specified revision.
wp_is_post_revision() Определяет является ли указанная запись (пост) ревизией (редакцией записи).
wp_save_post_revision() Создает ревизию (копию) указанного поста/записи. Также удаляет лишние ревизии.
wp_list_post_revisions() Displays a list of a post's revisions.
wp_get_revision_ui_diff() Get the revision UI diff.
Хук Описание
wp_revisions_to_keep Filters the number of revisions to save for the given post.
wp_save_post_revision_check_for_changes Filters whether the post has changed since the latest revision.
wp_save_post_revision_post_has_changed Filters whether a post has changed.

Заметки для разработчика

Восстановление конкретной ревизии

$restored_id = wp_restore_post_revision( $revision_id );

Ограничить рост БД без отключения ревизий

  • Поставить разумный лимит через WP_POST_REVISIONS или фильтр.
  • Оставить autosave включенным для безопасности.

Очистка старых ревизий

WP-CLI - безопаснее прямого SQL:

// Удалить все ревизии
wp post delete $(wp post list --post_type=revision --format=ids) --force

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

$revs = get_posts( [
	'post_type'   => "revision",
	'numberposts' => -1,
	'date_query'  => [
		[ "before" => "2024-09-01" ],
	],
] );

foreach( $revs as $r ){
	$p = get_post( $r->post_parent );
	if( $p && "news" === $p->post_type ){
		wp_delete_post( $r->ID, true );
	}
}
echo "Done\n";

REST API

  • Список ревизий:

    GET /wp/v2/posts/{id}/revisions
  • Конкретная ревизия:

    GET /wp/v2/posts/{id}/revisions/{revisionId}