WP_SAVE_POST_REVISION() │ WP 2.6.0
Функция wp_save_post_revision()
создает ревизию (версию) текущей записи (поста) в WordPress. Это нужно для того, чтобы вы могли вернуться к предыдущей версии поста, если это потребуется.
Когда используется?
Обычно эта функция запускается сразу после обновления поста, так как каждое обновление создаёт новую ревизию, а самая последняя ревизия всегда соответствует текущему посту.
Используемые функции
wp_revisions_enabled()
wp_get_post_revisions()
_wp_post_revision_fields()
_wp_put_post_revision()
wp_revisions_to_keep()
wp_delete_post_revision()
Хуки (hooks) из функции
wp_save_post_revision_check_for_changes
wp_save_post_revision_post_has_changed
wp_save_post_revision_revisions_before_deletion
Возвращаемое значение
Функция может возвращать следующее:
int
— ID новой ревизии при успешном выполнении.WP_Error|null
— если произошла ошибка или нет изменений.
Пример использования
Чтобы создать ревизию поста с ID 13, вы можете вызвать функцию следующим образом:
wp_save_post_revision( 13 );
Изменения
Функция была добавлена в WordPress версии 2.6.0.
Код функции WP_SAVE_POST_REVISION()
Вот пример кода, который реализует wp_save_post_revision()
:
function wp_save_post_revision( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Запретить сохранение ревизий, если они должны сохраняться после вставки поста.
if ( doing_action( 'post_updated' ) && has_action( 'wp_after_insert_post', 'wp_save_post_revision_on_insert' ) ) {
return;
}
$post = get_post( $post_id );
if ( ! $post ) {
return;
}
if ( ! post_type_supports( $post->post_type, 'revisions' ) ) {
return;
}
if ( 'auto-draft' === $post->post_status ) {
return;
}
if ( ! wp_revisions_enabled( $post ) ) {
return;
}
// Сравнение обновленного поста с последней сохраненной ревизией.
$revisions = wp_get_post_revisions( $post_id );
if ( $revisions ) {
$latest_revision = null;
foreach ( $revisions as $revision ) {
if ( str_contains( $revision->post_name, "{$revision->post_parent}-revision" ) ) {
$latest_revision = $revision;
break;
}
}
if ( isset( $latest_revision ) && apply_filters( 'wp_save_post_revision_check_for_changes', true, $latest_revision, $post ) ) {
$post_has_changed = false;
foreach ( array_keys( _wp_post_revision_fields( $post ) ) as $field ) {
if ( normalize_whitespace( $post->$field ) !== normalize_whitespace( $latest_revision->$field ) ) {
$post_has_changed = true;
break;
}
}
$post_has_changed = (bool) apply_filters( 'wp_save_post_revision_post_has_changed', $post_has_changed, $latest_revision, $post );
if ( ! $post_has_changed ) {
return;
}
}
}
$return = _wp_put_post_revision( $post );
// Удаление старых ревизий, если установлено ограничение.
$revisions_to_keep = wp_revisions_to_keep( $post );
if ( $revisions_to_keep < 0 ) {
return $return;
}
$revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) );
$revisions = apply_filters(
'wp_save_post_revision_revisions_before_deletion',
$revisions,
$post_id
);
$delete = count( $revisions ) - $revisions_to_keep;
if ( $delete < 1 ) {
return $return;
}
$revisions = array_slice( $revisions, 0, $delete );
for ( $i = 0; isset( $revisions[ $i ] ); $i++ ) {
if ( str_contains( $revisions[ $i ]->post_name, 'autosave' ) ) {
continue;
}
wp_delete_post_revision( $revisions[ $i ]->ID );
}
return $return;
}
Связанные функции
Вот несколько связанных функций, которые могут быть полезны при работе с ревизиями постов:
wp_get_post_revision()
wp_get_post_revisions()
wp_is_post_revision()
wp_revisions_enabled()
wp_revisions_to_keep()
wp_text_diff()
Эти функции помогают управлять ревизиями и изменениями в ваших постах, что значительно улучшает процесс редактирования и обратного отслеживания изменений в WordPress.