将完整的帖子与两种不同帖子类型的4个摘录结合起来

时间:2019-05-09 18:09:56

标签: php wordpress wordpress-theming

我正在尝试使最新的帖子成为完整的帖子。该帖子可以来自两种不同的帖子类型“ post”和“ tutorial”。我还想显示四个摘录,两个摘录来自“ post”帖子类型,两个摘录自“ tutorial” post类型。我不想在摘要中重复完整的帖子。

我尝试使用一个WP_Query,这几乎使我明白了。我也尝试过使用多个WP_Query,但这并不是那么幸运。

$args  = array(
    'post_type' => array( 'post', 'tutorial' ),
    'post_per_page' => 5
);
$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    $count = 0;
    while ( $query->have_posts() ) : $query->the_post();
        if ( $count == 0 ) { ?>

            <h2><?php the_title(); ?></h2>
            <?php the_content();

            $count ++;

        } else { ?>
            <h2><?php the_title(); ?></h2>
            <?php the_excerpt();
        }
    endwhile;

endif;
wp_reset_postdata();
?>

所以这段代码使我非常接近。但是摘录不是我想要的。我希望它显示两个“帖子”摘录和两个“教程”摘录。现在显示的是“指南”的一个摘录和“帖子”的三个摘录。

1 个答案:

答案 0 :(得分:2)

在一个查询中设置该任务要复杂一些。我为您编写了一个代码,其中包含每个步骤的注释。请检查一下。

// first get last published post
$last_post = get_posts(
    array(
        'post_type' => array( 'post', 'tutorial' ),
        'numberposts' => 1
    )
);

// get two posts excluding $last_post which might be a post
$last_two_posts = get_posts(
    array(
        'post_type' => array( 'post' ),
        'numberposts' => 2,
        'exclude' => array($last_post[0]->ID)
    )
);

// get two tutorial excluding $last_post which might be a tutorial
$last_two_tutorials = get_posts(
    array(
        'post_type' => array( 'tutorial' ),
        'numberposts' => 2,
        'exclude' => array($last_post[0]->ID)
    )
);

$posts = array_merge($last_post, $last_two_posts, $last_two_tutorials);

foreach( $posts as $post ) {
    setup_postdata($post);
    // print content only for first post and excerpt for others
    if ($post->ID == $last_post[0]->ID) {
        the_content();
    } else { 
        if($post->post_type == 'post') {
            echo '<div class="post-excerpt">' . get_the_excerpt() . '</div>';
        } else {
            echo '<div class="tutorial-excerpt">' . get_the_excerpt() . '</div>'; 
        }
    }
}

wp_reset_postdata();