每三个POST轮流循环输出(在同一原始循环内)

时间:2013-02-06 作者:Jacob

我有一个(相对)棘手的情况,我的代码需要每三篇文章更改一次循环输出,在这三篇文章中,有两篇文章周围有div。

下面的代码显示了6篇文章,我想循环浏览总共24篇文章,重复四次。

有人能帮忙吗?谢谢

FIRST THREE

<div class="layer">

<div class="large left">
    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->
</div>

<div class="small left">
    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->

    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->
</div>

</div><!--layer-->

SECOND THREE

<div class="layer">

<div class="small left">
    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->

    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->
</div>

<div class="large right">
    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->
</div>

</div><!--layer-->

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

使用modulo 操作人员

PHP中的模签名是%, 其工作原理如下:例如,它给出除法的余数

5 % 2 = 1
9 % 3 = 0
11 % 7 = 4
因此,您的代码应该是这样的(我认为您的问题中有一个输入错误,在“前三个”中,第二个块应该标记为small right. 如果我在这里错了,只需编辑下面的代码。)

为了更好地概述,我将计数器从1开始,而不是像往常一样从0开始,因为更容易看到条件所针对的迭代。我还增加了最后一个条件的计数器-请确保不要再增加两次!

因此,在循环之前:

$counter = 1;
然后插入循环:

<?php
    if ( $counter % 3 == 1 ) { // use this line for the first and the fourth iteration
        echo \'<div class="layer">\';
    }
        if ( $counter % 6 == 1 ) { // use this line for the first iteration only
            echo \'<div class="large left">\';
        } else if ( $counter % 6 == 2 ) { // use this line for the second iteration only
            echo \'<div class="small right">\';
        } else if ( $counter % 6 == 4 ) { // use this line for the fourth iteration only
            echo \'<div class="small left">\';
        } else if ( $counter % 6 == 5 ) { // use this line for the fifth iteration only
            echo \'<div class="large right">\';
        }
        //nothing to do for the sixth and the third iteration
        // the item is the same all the time
?>
        <div class="item">
            <?php the_title(); ?>
            <?php the_content(); ?>
        </div><!--item-->
<?php
        if ( $counter % 6 == 1 || $counter % 6 == 3 || $counter % 6 == 5 || $counter % 6 == 0 ) { // use this line everytime you close a subblock
            echo \'</div>\';
        }
    if ( $counter++ % 3 == 0 ) { // use this line for the third and the sixth iteration
        echo \'</div>\';
    }
?>

SO网友:Joshua Richards

我认为这会奏效:

<?php 
$counter = 1;
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div class="layer">

    <?php if ($counter < 3) { ?>
        <div class="large left">
            <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
            </div><!--item-->
        </div>
        <div class="small left">
            <div class="item">
            <?php the_title(); ?>
            <?php the_content(); ?>
            </div><!--item-->

            <div class="item">
            <?php the_title(); ?>
            <?php the_content(); ?>
            </div><!--item-->
        </div>
    <?php
            $counter++;
        } elseif ($counter < 6) { ?>
            <div class="small left">
                <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
                </div><!--item-->

                <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
                </div><!--item-->
            </div>

            <div class="large right">
                <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
                </div><!--item-->
            </div>
    <?php
            $counter++;
        } else { 
            $counter = 0;
        }
    ?>
</div><!--layer-->
?>
设置计数器,如果循环小于3,则执行第一个选项,否则如果循环小于6,则执行第二个选项,否则,重置计数器

SO网友:Joshua Richards

我认为这可能有效,可能需要一些改进:

<?php if ($counter == 1){ ?>
    <div class="layer">
        <div class="large left">
            <div class="item">
            <?php the_title(); ?>
            <?php the_content(); ?>
            </div><!--item-->
        </div>
<?php } elseif ($counter == 2){ ?>}
        <div class="small left">
            <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
            </div><!--item-->

<?php } elseif ($counter == 3){ ?>}
            <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
            </div><!--item-->
        </div><!--end small left-->
    </div><!--end layer-->
<?php } elseif ($counter == 4){ ?>}
    <div class="layer">
        <div class="small left">
            <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
            </div><!--end item-->
<?php } elseif ($counter == 5){ ?>}
            <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
            </div><!--item-->
        </div><!--end small left-->
<?php } elseif ($counter == 6){ ?>}
        <div class="large right">
            <div class="item">
                <?php the_title(); ?>
                <?php the_content(); ?>
            </div><!--item-->
        </div>
    </div><!--layer-->
<?php }
    $counter++;
    if (($wp_query->current_post + 1) == ($wp_query->post_count)) {
        switch($counter){
            case 1:
                echo \'</div><!--end layer-->\';
                break;
            case 2:
                echo \'</div><!--end small left-->
                        </div><!--end layer-->\';
                break;
            case 3:
                break;
            case 4:
                echo \'</div><!--end small left-->
    </div><!--end layer-->\';
                break;
            case 5:
                echo \'</div><!--end layer-->\';
                break;
            case 6:
                break;
            default:
                break;
        }
    }
endwhile;?>

SO网友:Jacob

作为参考,另一个论坛上的某个人获得的相同正确输出略有不同(尽管使用相同的原则…)。多亏了这两个!

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

$position = $wp_query->current_post;
$p3 = $position%3;
$p6 = $position%6;
$number_posts = $wp_query->post_count-1;

if( $p3 == 0 ) echo \'<div class="layer">\';
if( $p6 == 0 ) echo \'<div class="large left">\';
elseif( $p6 == 1 || $p6 == 3) echo \'<div class="small left">\';
elseif( $p6 == 5 ) echo \'<div class="large right">\'; ?>

    <div class="item">
    <?php the_title(); ?>
    <?php the_content(); ?>
    </div><!--item-->

<?php if( $position == $number_posts || in_array($p6, array(0, 2, 4, 5)) ) echo \'</div>\';
if( $p3 == 2 || $position == $number_posts ) echo \'</div><!--layer-->\'; 

endwhile; ?>

结束

相关推荐

Multiple loops are not reset

我可爱的同事们再次设计了一款让我很难在Wordpress中找到它的东西。令人惊讶的是,这是我以前做过多次的事情;在一个页面上有最近的帖子和页面内容。主页是一个页面。在页面内容上方有三篇最近的帖子。对于帖子,我需要在<!--more--> 标签这个循环似乎工作得很好。稍后,在模板中,我循环查看实际页面内容。无论我做什么,它总是给我不可靠的结果。这是我的索引的精简版本。php/页。php模板(它们恰好相同):<div id=\"content\"> <?php g