Как использовать функцию wp_save_post_revision() в WordPress?

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.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *