1

我需要一个 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++;
        ?>

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

4

2 回答 2

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 - 你会遇到麻烦。

于 2013-10-28T17:03:47.327 回答
0

$i在循环之外递增while,因此在循环内部$i将始终是==0and $i % 4 == 0

前移。$i++;_} // end while

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

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

  • 要么开始$i=1而不是0

  • 或紧随$i++其后while

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

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

于 2013-10-28T16:38:13.603 回答