私は私の投稿をループできるようにしたいのですが、これに対するすべての投稿に対して:
1)カスタムフィールドが真か偽かを確認します。
2)trueの場合、投稿のデータを表示します(the_title、the_content ...)。
3)がfalseの場合、同じデータ構造(the_title、the_content ...)を表示しますが、この記事の前回の改訂。
出来ますか?そしてどうやって?
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
}
}
うまくいけば、あなたはそれをあなたのニーズに合わせてさらに調整することができます!
はい、可能です。 wp_get_post_revisions($post_id)
関数を使って投稿のリビジョンにアクセスすることができます。これはpostのリビジョンの配列を返します。配列の最初の要素は現在のバージョンのpostと同じなので、2番目の要素の値を取ります。