是否可以显示以前的帖子修订?

时间:2016-10-30 作者:Ben

我希望能够循环浏览我的帖子,但是for every post to this:

1) 检查某个自定义字段是否为true或false。

2) 如果为true,只需显示帖子的数据(\\u标题、内容…)。

3) 如果为false,则显示相同的数据结构(\\u标题、\\u内容…),但与此帖子的前一版本相同。

有可能吗?如何做到这一点?

2 个回复
最合适的回答,由SO网友:birgire 整理而成

首先我们看看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 可能与作者相符。

Alternative

现在wp_get_post_revisions() 是的包装器get_children(), 所以我想知道为什么它必须先获取给定帖子的所有修订,然后再过滤掉一个。为什么不试着直接取它,只取需要的东西呢?当我们尝试以下操作时(PHP 5.4+):

$revisions = wp_get_post_revisions(
    $post_id,
    [
        \'offset\'       => 1,    // Start from the previous change (ofset changed to offset)
        \'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,
    [
        \'offset\'           => 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,
    [
        \'offset\'           => 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(),
        [
            \'offset\'           => 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
    }
}
希望您可以根据自己的需要进行进一步调整!

SO网友:Piotr Kliks

是的,这是可能的。您可以使用访问post的修订wp_get_post_revisions($post_id) 作用它返回post版本的数组,数组的第一个元素与post的当前版本相同,所以应该取第二个元素的值。

相关推荐

当in_the_loop()为假时,何时以及为什么is_Single(‘my_cpt’)为真?

我正在使用模板系统的示例代码。此地址的页码:http://project.test/my_cpt/hello-post/.无法理解原因is_singular( \'my_cpt\' ) 是true 虽然in_the_loop() 是false.在页面模板中The Loop "E;“工程”:if ( have_posts() ) { while ( have_posts() ) { the_post(); ?>