Last post in loop when even

时间:2018-10-15 作者:Michelle

我使用这段代码尝试检查每个页面上的最后一篇文章循环是否均匀,以便添加不同的类。

这可以检查它是否是最后一篇文章:

( ( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count )
这可以检查它是否是一个均匀的帖子

( $wp_query->current_post % 2 == 0 )
但这并没有检查这是否是最后一篇文章,甚至。

 ( ( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count ) && ( $wp_query->current_post % 2 == 0 );
我的问题是,我想在列中显示帖子,避免在有偶数帖子时,最后一篇帖子显示在有间隙的列中。

2 个回复
SO网友:Michael
<?php if( have_posts() ) : ?>

    <?php $count = 0; ?>

    <?php while( have_posts() ) : the_post(); ?>

    <?php
    global $count;

    $col = \'col-lg-6\';

    if($count%3 == 0) {
        $col = \'col-lg-12\';
    } else {
        $col = \'col-lg-6\';
    }

    $count++;

    ?>

    <article id="post-<?php the_ID(); ?>" <?php post_class( $col ); ?>>
        [...]
        [...]
        [...]
    </article>

    <?php endwhile; ?>
<?php endif; ?>
SO网友:birgire

一般来说,我认为应该使用CSS来处理列布局,而无需更改生成的HTML。列数可能需要随设备等更改。

所以在这里,我只想看看这句话:

这可以检查它是否是最后一篇文章:
( ( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count )

这看起来相当复杂,很可能会减慢开发人员尝试评估此表达式的速度。

让我们深入了解一下:

这个$wp_query->current_post-1 作为初始值,循环中的每个帖子都会增加该值。

以下源参考与此相关:

https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/class-wp-query.php#L488

https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/class-wp-query.php#L3069

https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/class-wp-query.php#L3085

https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/class-wp-query.php#L3115

循环中的第一个帖子$wp_query->current_post0. 然后,此语句变为:

   ( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count
=> ( 1 == 0 + 1 ) == $wp_query->post_count
=> ( 1 == 1 ) == $wp_query->post_count
=> true == $wp_query->post_count
缺少括号,因此我们需要检查运算符的优先级:

https://secure.php.net/manual/en/language.operators.precedence.php

希望我的回答是正确的:-)

循环中的第二个帖子$wp_query->current_post1. 然后语句变成:

   ( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count
=> ( 1 == 1 + 1 ) == $wp_query->post_count
=> ( 1 == 2 ) == $wp_query->post_count
=> false == $wp_query->post_count

因此,检查:

( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count
似乎可以归结为:

true == $wp_query->post_count
循环中的第一个帖子,否则

false == $wp_query->post_count
这可能不是你想要的。

要查看循环中的最后一篇帖子,您似乎在寻找:

current_post(s) | post_count 
----------------------------
 -1                   0
 0*                   1
 0, 1*                2
 0, 1, 2*             3
 0, 1, 2, 3*          4
...
其中*标记循环中的最后一个post索引。

使用当前帖子索引和帖子计数确定循环(*)中最后一篇帖子的规则似乎是:

$wp_query->current_post + 1 === $wp_query->post_count
在哪里$wp_query->post_count > 0.

还可以在此处查看相同的循环结束条件:

https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/class-wp-query.php#L3115

希望这有助于你进一步调查此事!

结束

相关推荐

Conditional loop for category

我想为父类别和子类别显示不同的样式我该怎么做?如果我浏览父类别,然后显示样式,当浏览子类别时,则显示不同的样式,如何仅显示父类别名称和此类别中的3篇文章1.父类别名称1……3此类邮件……2.父类别名称2……3此类邮件……