PHP:中断循环,然后继续?

时间:2020-12-26 19:18:51

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.

我遇到了WordPress帖子循环的问题。我想打破post循环,在帖子中添加一些HTML div标签。例如,我试图在第一篇文章后在帖子周围添加div .wrap。因为它是包装帖子,所以它应该只有一次。

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?

问题是由于循环,.wrap div正在重复。我怎样才能打破循环,只添加一次.wrap div然后继续循环?

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 个解决方案

#1


3  

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 } ?>

#2


1  

You can just use an iterator index, like this:

你可以使用迭代器索引,如下所示:

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

    ...
    $i++
}

#3


1  

<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>

#1


3  

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 } ?>

#2


1  

You can just use an iterator index, like this:

你可以使用迭代器索引,如下所示:

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

    ...
    $i++
}

#3


1  

<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>