Wordpress while 循环与current_post

Wordpress while loop with current_post

提问人:user3642075 提问时间:1/14/2023 更新时间:1/14/2023 访问量:173

问:

我创建了一个 ajax 回调,在其中显示带有特定标签的帖子,效果很好。 但是我想显示 5 个帖子,每个帖子周围都有不同的 DIV,但我无法让它工作。


    function filter_projects() {
      $tagSlug = $_POST['tags'];

      if(!empty($tagSlug)) {
        
        $ajaxposts = new WP_Query(array(
          'post_type' => 'projects',
          'posts_per_page' => 5,
          'order_by' => 'date',
          'order' => 'desc',
          'tax_query' => array(
              array(
                  'taxonomy' => 'tag',
                  'terms' => $tagSlug,
                  'field' => 'slug',
              )
          ),
        ));
        
      } else {
        
        $ajaxposts = new WP_Query(array(
          'post_type' => 'projects',
          'posts_per_page' => 5,
          'order_by' => 'date',
          'order' => 'desc',
        ));
        
      }

        $response = '';

      


      if ( $ajaxposts->have_posts() ) :     
          while ( $ajaxposts->have_posts() && $ajaxposts->current_post = 0 ) : $ajaxposts->the_post(); 
            $template = include('templates/index-case.php');         
            $response .= '<div class="1">' . $template . '</div>';
          endwhile; 
      endif;

      if ( $ajaxposts->have_posts() ) :     
          while ( $ajaxposts->have_posts() && $ajaxposts->current_post = 1 ) : $ajaxposts->the_post(); 
            $template = include('templates/index-case.php');         
            $response .= '<div class="2">' . $template . '</div>';
          endwhile; 
      endif;

      if ( $ajaxposts->have_posts() ) :     
          while ( $ajaxposts->have_posts() && $ajaxposts->current_post = 2 ) : $ajaxposts->the_post(); 
            $template = include('templates/index-case.php');         
            $response .= '<div class="3">' . $template . '</div>';
          endwhile; 
      endif;

      if ( $ajaxposts->have_posts() ) :     
          while ( $ajaxposts->have_posts() && $ajaxposts->current_post = 3 ) : $ajaxposts->the_post(); 
            $template = include('templates/index-case.php');         
            $response .= '<div class="4">' . $template . '</div>';
          endwhile; 
      endif;

      if ( $ajaxposts->have_posts() ) :     
          while ( $ajaxposts->have_posts() && $ajaxposts->current_post = 4 ) : $ajaxposts->the_post(); 
            $template = include('templates/index-case.php');         
            $response .= '<div class="4">' . $template . '</div>';
          endwhile; 
      endif;
      

      echo $response;
      exit;
    }
    add_action('wp_ajax_filter_projects', 'filter_projects');
    add_action('wp_ajax_nopriv_filter_projects', 'filter_projects');
    

我尝试了很多不同的语法方法,但似乎没有任何效果。 我只看到第一篇文章。

输出假设如下所示:

    <div class="one">Post One</div>
    <div class="two">Post Two</div>
    <div class="three">Post Three</div>
    <div class="four">Post Four</div>
    <div class="five">Post Five</div>

有人可以帮我吗?

谢谢 安德烈亚斯

php wordpress while-loop

评论


答:

0赞 S M Jobayer Alam 1/14/2023 #1

你有没有检查过有多少帖子从你的数据库返回。使用var_dump

var_dump($ajaxposts);

并检查。如果它返回 5 post,则您的显示代码有问题。您必须使用 loop 来显示记录。例如

if ( $ajaxposts->have_posts() ) {
    while ( $ajaxposts->have_posts() ) {
        $ajaxposts->the_post();
        // display content
    }
}

评论

0赞 user3642075 1/14/2023
感谢您的回复。是的,它返回五个。所以我认为它在显示代码中。但是,如果循环需要在不同的 div 中,我该如何应用它呢?就像我上面提到的。
1赞 fermincreative 1/14/2023 #2

请务必查看您的WP_Query是否返回了您期望的帖子。var_dump($ajaxposts)

我不确定为什么你要多次循环你的WP_Query,而你试图实现的目标可以通过使用一个简单的变量来实现,该变量在你循环时计数:

    $count=0;
$template = include('templates/index-case.php');   

if ( $ajaxposts->have_posts() ) {
    while ( $ajaxposts->have_posts() ) {       
        $ajaxposts->the_post() ;  
            $count++;  
            $response .= '<div class="'.$count.'">' . $template . '</div>';
    } // end while
} // end if

或者,如果您希望分配特定名称,则可以使用相同的 count 变量来遍历具有名称的数组:

$div_names=array('one','two','three','four','five');
$count=0;
$template = include('templates/index-case.php');   

if ( $ajaxposts->have_posts() ) {
    while ( $ajaxposts->have_posts() ) {       
        $ajaxposts->the_post() ;  
            $response .= '<div class="'.$div_names[$count].'">' . $template . '</div>';
            $count++;  
    } // end while
} // end if

评论

0赞 user3642075 1/14/2023
谢谢你的回答。我试图使用你写的代码,但由于某种原因,它听起来很奇怪。如果我有 3 个 div,它会回显 3 个模板,然后回显带有计数的 div。像这样: <模板 div/post><模板 div/post><模板 div/post><div class=“1”>1</div><div class=“2”>1</div><div class=“3”>1</div> 所以它们没有包裹在帖子周围。你知道为什么吗?
0赞 fermincreative 1/15/2023
这可能与使用 include() 而不是 get_template_part() 有关。我将尝试测试代码。
0赞 user3642075 1/15/2023
使用您的代码,我只需将 div 移动到模板中即可使其工作。谢谢!