我需要在div中包装每4个wordpress帖子

时间:2013-10-28 16:31:17

标签: php wordpress

我需要一个div来包装wordpress循环中的每四个帖子。所以就像

<div>
four posts
</div>
<div>
four posts
</div>

我目前的代码就是这个

<?php 
        $i = 0;
        $wrap_div = "<div class='frak'>";
            if ( have_posts() ) {
               echo $wrap_div;
                while ( have_posts() ) {
                    the_post();

        ?>

        <div class="wine-section">
            <?php the_post_thumbnail(); ?>
            <div class="wine-info">
                <a href="<?php the_permalink(); ?>"><?php the_title( '<h1>', '</h1>' ); ?></a>
                <?php the_meta(); ?>
            </div><!-- /wine-info -->
            <div class="c"></div>
        </div><!-- /wine-section -->

        <?php       
                if ($i % 4 == 0) { echo "</div>" . $wrap_div; }
                } // end while
            } // end if
            $i++;
        ?>

此代码单独包装每个帖子。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

正如geomagas所指出的那样 - 你正在将变量递增到循环之外。然后0 % 4 == 0评估为真 - 那是因为当你将0除以4时,你得到0.为了解决这种情况,你还需要一个规则。

另外请不要忘记,如果帖子的总数例如是12,那么使用当前代码,您的帖子末尾会有一个空的“frak”div。

<?php 
    $i = 0;
    $wrap_div = "<div class='frak'>";
        if ( have_posts() ) {
            // Grab the total posts that are being displayed
            $total_posts = $wp_query->post_count;
            echo $wrap_div;
            while ( have_posts() ) {
                the_post(); ?>
                <div class="wine-section">
                    <?php the_post_thumbnail(); ?>
                    <div class="wine-info">
                        <a href="<?php the_permalink(); ?>"><?php the_title( '<h1>', '</h1>' ); ?></a>
                        <?php the_meta(); ?>
                    </div><!-- /wine-info -->
                    <div class="c"></div>
                </div><!-- /wine-section -->
                <?php 
                // Is this a fourth post? If so, make sure it is not the last post?
                if ( $i % 4 == 0 && $i != 0 && ( $i + 1 ) != $total_posts ) {
                    echo '</div>' . $wrap_div;
                }
                $i ++;
            } // end while
            // Close the $wrap_div
            echo '</div>';
        } // end if
?>

正如您所看到的那样,打印结束标记的if语句和新包装现在更加复杂。 它确保$ i不为0(意味着它仍然是第一个帖子)并且$ i + 1不等于显示的帖子总数(对于这种情况,我们在while()循环后关闭)。

如果你想知道为什么我们在while()循环之后关闭 - 仅仅是因为你的帖子在4上可能并不总是多个(我不确定这里的英文翻译是否正确) - 以及如果是这种情况,你不会在while循环后关闭你的div - 你会遇到麻烦。

答案 1 :(得分:0)

您正在$i循环之外递增while,因此其中$i始终为==0,因此$i % 4 == 0

$i++;之前移动} // end while

但是,您还应该将条件更改为$i % 4 == 3,因为$i % 4 == 0会在第一次迭代(true)中评估为$i=0并生成初始<div> 1}}只有一个帖子。

或者,您可以保持原状,并且:

  • $i=1而不是0

  • 开头
  • 或在$i++之后立即移动while

现在,当您有4个帖子的确切倍数时,最后会显示一个额外的空<div>。那是因为你假设,当<div>关闭时,另一个应该自动打开。情况并非总是如此。

假设您选择了上面的$i % 4 == 3解决方案,并且在echo '</div>';循环后已经有while,请将您的条件更改为if(($i % 4 == 3)&& have_posts())