在没有修改循环的情况下,在X次数之后包装WordPress帖子?

时间:2015-11-22 04:32:56

标签: php wordpress

我有一个WordPress入门主题,其中一个功能是通过选择不同的模板部分来选择不同的存档格式。我的index.php基本上是这样的:

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

                <!-- To see additional archive styles, visit the /parts directory -->
                <?php get_template_part( 'parts/loop', 'archive' ); ?>

            <?php endwhile; ?>  

                <?php joints_page_navi(); ?>

            <?php else : ?>

                <?php get_template_part( 'parts/content', 'missing' ); ?>

            <?php endif; ?>

其中一种存档格式是网格格式,基本上需要输出如下:

Start Row
    Post 1
    Post 2
    Post 3
End Row
Start Row
    Post 4
    Post 5
    Post 6
End Row
.....

通常,我使用这种方法:

<?php foreach (array_chunk($posts, 2, true) as $posts) :  ?>

    <div class="row">

        <?php foreach( $posts as $post ) : setup_postdata($post); ?>

            <div class="six columns"> 
                <?php the_content(); ?>
            </div>

    <?php endforeach; ?>

    </div>

<?php endforeach; ?>

但是,这段代码需要与标准WP循环不同的循环类型,这使得很难集成到主题中,而用户也不必对循环进行调整。

所以我的问题是,是否可以在不修改标准WordPress循环的情况下用div包装X个帖子数量?

1 个答案:

答案 0 :(得分:3)

您可以使用迭代器$i;

开始对帖子进行迭代(计数)

archive.phpindex.php(包含主要查询的文件)中:

<?php if (have_posts()) :
    $i = 1; //Start counting

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

    <!-- To see additional archive styles, visit the /parts directory -->
    <?php get_template_part( 'parts/loop', 'archive' ); ?>

    <?php $i++; //Increase $i ?>

    <?php endwhile; ?>  

    <?php joints_page_navi(); ?>

<?php else : ?>

    <?php get_template_part( 'parts/content', 'missing' ); ?>

<?php endif; ?>

在您的parts/loop文件(包含循环&#34; <article></article>&#34;)中,进行计算以检查当前的帖子索引并决定是跳过,开始还是关闭包装标签:

<?php
//Doing some math           
$x = 4 //Change this to any number you want
if ( $i == 1 || $i == $x || $i % $x == 1 ) {
    $before_article = '<div class="wrapper">'; //The wrapper start tag
}
if ( $i % $x == 0 || $wp_query->current_post + 1 == $wp_query->post_count ) {
    $after_article = '</div>'; //The wrapper end tag
}

<?php echo $before_article; ?>
<article>
    <!-- post content here -->
</article>
<?php echo $after_article; ?>
<?php $before_article = ''; $after_article = ''; ?>