PHP: Break loop and then continue?

2019-06-07 11:50发布

I'm having a problem with the WordPress posts loop. I'd like to break down the post loop, to add some HTML div tags in the post. For example, I'm trying to add a div .wrap around the posts after first post. As it's to wrap the posts, so it should be only once.

The problem is that the .wrap div is being repeated because of the loop. How can I break the loop, and add the .wrap div only once and then continue the loop?

Here's my code:

while ($wp_query->have_posts()) :

    $wp_query->the_post(); 
    if($wp_query->current_post <= 1){ ?>
        <div class="x">
        .. post 1
        </div>
    <?php }
    if($wp_query->current_post > 1){ ?>
        <div class="wrap"> <!-- should be only once -->
            <div class="y">
            .. post 2
            </div>

            <div class="y">
            .. post 3
            </div>
        </div><!-- should be only once -->
    <?php } ?>

endwhile;

3条回答
够拽才男人
2楼-- · 2019-06-07 12:03
<div class="x">

while ($wp_query->have_posts()) :
    $wp_query->the_post();
    <--print post-->
    if($wp_query->current_post <= 1){
        </div><div class="y">
    }
endwhile;

</div>

You will get an empty <div class="x" /> if there's no post and an empty <div class="y" /> if there's only one post. But may be that's feasible in your case...


edit: example

<?php
$wp_query = new WPDummy; 

echo '<div class="x">';    
while ($wp_query->have_posts()) :
    $wp_query->the_post();
    $wp_query->the_content();
    if($wp_query->current_post <= 1){
        echo '</div>', "\n",'<div class="y">';
    }
endwhile;
echo '</div>';

// boilerplate
class WPDummy {
    public $current = null;
    public $current_post = 0;
    public function __construct() {
        $this->posts = array( array('content'=>'A'),array('content'=>'B'),array('content'=>'C'),array('content'=>'D') );
    }

    public function have_posts() {
        return false!=current($this->posts);
    }

    public function the_post() {
        $this->current_post+=1;
        $this->current = current($this->posts);
        next($this->posts);
    }

    public function the_content() {
        echo '<span class="content">', $this->current['content'], '</span>';
    }
}

prints

<div class="x"><span class="content">A</span></div>
<div class="y"><span class="content">B</span><span class="content">C</span><span class="content">D</span></div>
查看更多
欢心
3楼-- · 2019-06-07 12:08

You can just use an iterator index, like this:

$i = 0;
while (...) {
    if ($i == 1) {
       // actions you need to do only once
    }

    ...
    $i++
}
查看更多
劳资没心,怎么记你
4楼-- · 2019-06-07 12:14

Try this

<?php
while ($wp_query->have_posts()) :
    $wp_query->the_post(); 
    if($wp_query->current_post <= 1){ ?>
        <div class="x">
        .. post 1
        </div>
        <div class="wrap"> <!-- should be only once -->
    <?php 
    $is_wrapped = 1;
    }
    if($wp_query->current_post > 1){ ?>
        <div class="y">
          .. post 2, then post 3, ...
        </div>
    <?php } 
endwhile;?>
<?php if (!empty($is_wrapped)){ ?>
        </div><!-- should be only once -->
<?php } ?>
查看更多
登录 后发表回答