web-dev-qa-db-ja.com

以前のポストリビジョンを表示することは可能ですか?

私は私の投稿をループできるようにしたいのですが、これに対するすべての投稿に対して

1)カスタムフィールドが真か偽かを確認します。

2)trueの場合、投稿のデータを表示します(the_title、the_content ...)。

3)がfalseの場合、同じデータ構造(the_title、the_content ...)を表示しますが、この記事の前回の改訂。

出来ますか?そしてどうやって?

1
Ben

まずwp_get_post_autosave関数を調べます。

コア関数wp_get_post_autosave()wp_get_post_revisions()関数をどのように使用しているかを知ることは有益です。

からのすべてのリビジョンをループします

$revisions = wp_get_post_revisions( 
    $post_id, 
    array( 
        'check_enabled' => false 
    ) 
);

そしてそれから:

foreach ( $revisions as $revision ) {
    if ( false !== strpos( $revision->post_name, "{$post_id}-autosave" ) ) {
        if ( $user_id && $user_id != $revision->post_author )
            continue;

        return $revision;
    }
}

"{$post_id}-autosave"を含み、$user_idがその作者と一致する可能性がある場所で、スラッグを付けて最初のリビジョンを返す.

代替案

wp_get_post_revisions()get_children()のラッパーなので、1つを除外する前に、なぜそれが与えられた投稿のためのすべてのリビジョンを取得しなければならないのでしょうか。必要なものだけを直接取得しないでください。試してみると以下(PHP 5.4以降):

$revisions = wp_get_post_revisions(
    $post_id,
    [
        'ofset'           => 1,    // Start from the previous change
        'posts_per_page'  => 1,    // Only a single revision
        'name'            => "{$post_id}-autosave-v1",
        'check_enabled'   => false,
    ]
);

posts_per_pageは効果がありません。これを試した後、私はposts_per_page引数を使用して以下のものを動作させることに成功しました:

$revisions = wp_get_post_revisions(
    $post_id,
    [
        'ofset'           => 1,    // Start from the previous change
        'posts_per_page'  => 1,    // Only a single revision
        'post_name__in'   => [ "{$post_id}-autosave-v1" ],
        'check_enabled'   => false,
    ]
);

前のリビジョンだけを入手

これで、前のリビジョンのみを取得するように上記を調整できます。つまり、自動保存ではありません。

$revisions = wp_get_post_revisions(
    $post_id,
    [
        'ofset'           => 1,    // Start from the previous change
        'posts_per_page'  => 1,    // Only a single revision
        'post_name__in'   => [ "{$post_id}-revision-v1" ],
        'check_enabled'   => false,
    ]
);

ここでは{$post_id}-revision-v1スラッグをターゲットにしています。

ここではv1を使用していますが、後で必要に応じて調整できます。

最後にあなたの質問に答えるために、ここに提案があります:

$show = get_post_meta( get_the_ID(), 'somekey', true );

if( $show )
{
    // Template part
    get_template_part( 'template-parts/content' );
}
else
{
    // Fetch the previous revision only
    $revisions = wp_get_post_revisions(
        get_the_ID(),
        [
            'ofset'           => 1,    // Start from the previous change
            'posts_per_page'  => 1,    // Only a single revision
            'post_name__in'   => [ sprintf( "%d-revision-v1", get_the_ID() ) ],
            'check_enabled'   => false,
        ]
    );

    if( $revisions )
    {
        $post = reset( $revisions );
        setup_postdata( $post );

        // Template part
        get_template_part( 'template-parts/content' );

        wp_reset_postdata();
    }
    else
    {
         // Some fallback here
    }
}

うまくいけば、あなたはそれをあなたのニーズに合わせてさらに調整することができます!

1
birgire

はい、可能です。 wp_get_post_revisions($post_id)関数を使って投稿のリビジョンにアクセスすることができます。これはpostのリビジョンの配列を返します。配列の最初の要素は現在のバージョンのpostと同じなので、2番目の要素の値を取ります。

1
Piotr Kliks