首页上的三种不同的帖子类型

时间:2016-08-01 作者:Garry Aylott

Update:谢谢你的回答,但在实现了这段代码之后,它打破了主题/站点。我肯定是我,但这是我的功能。php文件:

// Custom posts for homepage
function get_featured_one() { /* returns post #1 */ }
function get_featured_two() { /* returns posts #2 and #3 */ }

add_action( \'pre_get_posts\', function( $query ) {
    if ( ! $query->is_main_query() || is_admin() )
        return;

    if ( is_front_page() ) {
        $featured_one = get_featured_one();
        $featured_two = get_featured_two();

        $exclude = array_merge( wp_list_pluck( $featured_one->posts , \'ID\' ), wp_list_plugk( $featured_two->posts, \'ID\' ) );
        $query->set( \'post__not_in\', $exclude );
    }
});

function get_featured_one() {
    return new WP_Query( array(
        \'ignore_sticky_posts\' => true,
        \'posts_per_page\' => 1,
    ) );
}

function get_featured_two() {
    return new WP_Query( array(
        \'ignore_sticky_posts\' => true,
        \'tag\' => \'featured\',
        \'posts_per_page\' => 2,
    ) );
}
这是我的头文件,包含最新帖子:

<section class="header-latest-post">    
    <?php if ( is_front_page() && ! is_paged() ) :
        $latest = get_featured_one();
        while ( $latest->have_post() ) : $latest->the_post();
            get_template_part(\'content\',get_post_format());
        endwhile;
    endif; ?>
</section>
<!-- End latest post -->
这是主页上两篇最新帖子和标准循环的代码:

<!-- Start two featured posts -->
<section class="two-feat-posts">
    <?php if ( is_front_page() && ! is_paged() ) :
    $latest = get_featured_two();
    while ( $latest->have_post() ) : $latest->the_post();
        get_template_part(\'content\',get_post_format());
    endwhile;
    endif; ?>
</section>
<!-- End two featured posts -->

<h4 class="main-title">Previous episodes</h4>

<!-- Start standard loop -->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <?php get_template_part(\'content\',get_post_format()); ?>
<?php endwhile; endif; ?>
<!-- End standard loop -->
如需更多帮助,我们将不胜感激:)


我一直在编写一个主题,遇到了一个难题,我已经解决了一半,但遇到了困难。

基本上,我想实现的是:

要显示在主页标题区域的最新帖子(帖子1)有两个特色帖子(帖子2和帖子3),每个帖子的宽度为50%,然后是10个帖子(帖子4到13)列表中的其余帖子(帖子4到13)我有一个主循环,显示10个帖子,这也抵消了最新帖子(因为最新帖子位于网站顶部区域):

<?php

        $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
        $args = array (
            \'post_type\' => \'post\',
            \'posts_per_page\' => \'10\',
            \'paged\' => $paged
        );

        $mainLoop = new WP_Query( $args );

        if( $mainLoop->have_posts() ) :

        while( $mainLoop->have_posts() ) : $mainLoop->the_post(); ?>

    <?php get_template_part( \'content\', get_post_format() ); ?>

    <?php endwhile;

        the_posts_pagination( array(
            \'mid_size\'  => 2,
            \'prev_text\' => __( \'Previous\', \'textdomain\' ),
            \'next_text\' => __( \'Next\', \'textdomain\' ),
        ) );

        wp_reset_postdata();

        else : get_template_part( \'content\', \'none\' );

        endif;

    ?>
下面是标题中最新帖子的代码:

<?php
            $args = array (
                \'post_type\' => \'post\',
                \'posts_per_page\' => \'1\'
            );

            $latestPost = new WP_Query( $args );

            if( $latestPost->have_posts() ):

            while( $latestPost->have_posts() ): $latestPost->the_post();

                 get_template_part(\'content\',get_post_format());

             endwhile;

            endif;

            wp_reset_postdata();
        ?>
我遇到的问题是分页。它在每个页面上显示相同的帖子,所以我implemented this fix from the codex. 这对分页和偏移量都起到了作用,但现在标题中的最新帖子也偏移了一个,而不显示最新帖子。

我还没有对这两篇特色文章进行编码,所以我也可以对它们提出一些建议(在一个页面上有3个自定义循环可以吗?)。

谢谢

1 个回复
SO网友:kovshenin

由于您在首页和分页页面上显示的帖子数量与主查询中显示的帖子数量不同,因此您实际上不需要处理偏移量。您只需从查询中排除已经显示的三篇文章,您可以使用pre_get_posts 措施:

function get_featured_one() { /* returns your post #1 */ }
function get_featured_two() { /* returns your posts #2 and #3 */ }

add_action( \'pre_get_posts\', function( $query ) {
    if ( ! $query->is_main_query() || is_admin() )
        return;

    if ( is_front_page() ) {
        $featured_one = get_featured_one();
        $featured_two = get_featured_two();

        $exclude = array_merge( wp_list_pluck( $featured_one->posts , \'ID\' ), wp_list_plugk( $featured_two->posts, \'ID\' ) );
        $query->set( \'post__not_in\', $exclude );
    }
});
然后在模板文件中,只需删除$mainLoop, 因为WordPress早在到达模板文件之前就已经执行了该查询,所以无需再次运行该查询。您只需在标题中显示最新帖子:

<?php if ( is_front_page() && ! is_paged() ) : ?>
    <?php $latest = get_featured_one(); ?>
    <?php while ( $latest->have_post() ) : $latest->the_post(); ?>
        <!-- Output stuff here. -->
    <?php endwhile; ?>
<?php endif; ?>
同样的事情,但是get_featured_two() 为你的两篇50/50的文章提供存档/首页/索引模板。之后,(实际的)主循环将处理其他所有事情。这是您的订单:

  • $latest->have_posts()
  • $featured->have_posts()
  • have_posts()
对于分页的页面,您可能希望省略$featured 输出,但仍然将这些帖子从主查询中排除,因为您已经在首页上显示了它们。在主查询中包含它们还会更改主查询返回的帖子总数(在分页页面上),并会中断分页。

二者都get_featured_* 函数必须返回WP_Query 对象:

function get_featured_one() {
    return new WP_Query( array(
        \'ignore_sticky_posts\' => true,
        \'posts_per_page\' => 1,
    ) );
}

function get_featured_two() {
    return new WP_Query( array(
        \'ignore_sticky_posts\' => true,
        \'tag\' => \'featured\',
        \'posts_per_page\' => 2,
    ) );
}
它们也可能使用一些静态缓存来提高性能,但前提是您绝对确定在单个请求中多次调用它们必须产生完全相同的输出(即从未在switch_to_blog() 上下文)。

排除返回的帖子可能也是一个好主意_one() 从…起_two() 因为一篇帖子可能既有特色又有最新的。

我也做了类似的事情a bit more complex 在我的分号主题中。更为棘手的是,无论特色帖子是否贴在顶部,帖子的数量都必须保持不变,这就是抵消的魔力。但想法非常相似。

希望这有帮助。

相关推荐

当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(); ?>