Ревизии (редакции, изменения) поста
Ревизии это версии контента, создаваемые при обновлении записи (поста) и при авто-сохранении.
Общая информация
В 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}