【问题标题】:Second WordPress loop failing第二个 WordPress 循环失败
【发布时间】:2016-12-12 09:12:48
【问题描述】:

我有两个循环在我的页面上运行,一个用于从特定类别中获取一组帖子,然后进一步从自定义帖子类型中获取帖子,但由于某种原因,如果我同时输出它们,第二个循环不会显示并且如果我注释掉第一个,第二个会显示?

我有点不明白为什么?

第一个循环更新

<?php

  $post_query = new WP_Query(array( 'category_name' => 'email-content'));

  if ( $post_query->have_posts() ) {

    echo '<div class="tabs tabs_default">';
    echo '<ul class="horizontal">';
    while ( $post_query->have_posts() ) {
      $post_query->the_post();
      $title = strtolower(get_the_title());
      $title = str_replace(' ', '-', $title);
      echo'<li><a href="#'.$title.'">'.get_the_title().'</a></li>';
    } 

    echo '</ul>';

    while ( $post_query->have_posts() ) {
      $post_query->the_post();
      $title = strtolower(get_the_title());
      $title = str_replace(' ', '-', $title);
      echo '<div id="'.$title.'">';
      echo '<div><button class="copy" id="'.$title.'" data-clipboard-text="'.get_the_content().'" title="Copy">Copy</button></div>';
      echo '<div>'.get_the_content().'</div>';
      echo '</div>';
    } 

    $post_query->reset_postdata();

  }
?>

第二个循环更新

我不需要其中一个循环,因此我进一步改进了代码,但我仍然没有任何运气来输出第二个循环。

<?php

$featureThumb = new WP_Query( array(
    'post_type'         => 'resources',
    'meta_key'          => 'file_upload',
    'posts_per_page'    => -1
));

while ($featureThumb->have_posts()) : $featureThumb->the_post();

echo '<div>';

    if (has_post_thumbnail($post->ID)) {

        $thumb  = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'homepage-thumb-thumb' );
        echo '<img src="' . $thumb[0] . '" width="200" height="200" />' ;

    }; 

echo '<p><a href="'. get_field('file_upload') .'" target="_blank" download>Click here to download as PDF</a></p>';

endwhile;

unset($featureThumb); 

}

?>

【问题讨论】:

  • 您的第二个查询是$featureThumb,但随后您将循环访问$loop。另外,在每个循环之后调用wp_reset_postdata();这将重置全局 $post 变量。
  • @Dre 我的代码是不是有点混乱?我在这里让自己有点困惑。所以我在第一个帖子循环之后做wp_reset_postdata 对吗? Anf 然后我将 $loop 更改为 $featureThumb
  • @Dre 我已经更新了我的问题以反映我们的讨论 - 我做得对吗,因为第二个循环仍然无法输出
  • 我已将其缩小为第一个帖子循环出现问题,因为当我切换它们时它们都会显示,但我不确定它们有什么不同?
  • 如果不删除第一个“wp_reset_postdata();”一旦不再需要 $post_query 对象,您只需运行此函数。您正在运行第二个 while 循环,但查询已被重置。

标签: php wordpress


【解决方案1】:

您似乎有 3 个查询和 4 个循环,而不是两个。

另外,在 unset($featureThumb); 后面还有一个额外的 },应该删除。

您在问题中发布的三个查询是:

$post_query$loop$featureThumb。在最后一个你的循环是不正确的。它使用第二个对象。在循环中的第三个查询处更改 $loop$featureThumb

您需要在前两个查询之后使用wp_reset_postdata(),而不是有人建议的wp_reset_query(),它应该都可以工作。

wp_reset_query() 确保主查询已重置为原始主查询,而另一方面wp_reset_postdata() 确保全局$post 已恢复到主查询中的当前帖子。

更新

如果这不起作用,如果全局 $post 对象未定义,请尝试:

$post_query-&gt;reset_postdata();

$loop-&gt;reset_postdata();

更新 2

您的第一个查询和循环应如下所示:

<?php

  $post_query = new WP_Query(array( 'category_name' => 'email-content'));

  if ( $post_query->have_posts() ) {

    echo '<div class="tabs tabs_default">';
    echo '<ul class="horizontal">';
    while ( $post_query->have_posts() ) {
      $post_query->the_post();
      $title = strtolower(get_the_title());
      $title = str_replace(' ', '-', $title);
      echo'<li><a href="#'.$title.'">'.get_the_title().'</a></li>';
    } 

    echo '</ul>';

    while ( $post_query->have_posts() ) {
      $post_query->the_post();
      $title = strtolower(get_the_title());
      $title = str_replace(' ', '-', $title);
      echo '<div id="'.$title.'">';
      echo '<div><button class="copy" id="'.$title.'" data-clipboard-text="'.get_the_content().'" title="Copy">Copy</button></div>';
      echo '<div>'.get_the_content().'</div>';
      echo '</div>';
    } 

    $post_query->reset_postdata();

  }
?>

【讨论】:

  • 非常感谢您花时间解释这两个重置,因为我不知道这一点。那么每次循环后我需要重置吗?
  • 在每个循环之后,但不是在最后一个之后,因为没有必要把它放在那里。
  • 所以我在每个while循环之后都设置了一个重置​​,但第一个循环仍然显示,但第二个循环仍然没有显示?
  • 我已经更新了我的问题以反映我们的讨论 - 我做得对吗,因为第二个循环仍然无法输出
  • wp_reset_postdatawp_reset_query 函数调用,所以它是相同的并且更好,因为第二个也重置了查询。可以看代码here
【解决方案2】:

您还必须在第一个循环结束时使用wp_reset_query();。所以第一个循环应该是:

<?php

  $post_query = new WP_Query(array( 'category_name' => 'email-content'));

  if ( $post_query->have_posts() ) {
    echo '<div class="tabs tabs_default">';
    echo '<ul class="horizontal">';
    while ( $post_query->have_posts() ) {
      $post_query->the_post();
      $title = strtolower(get_the_title());
      $title = str_replace(' ', '-', $title);
      echo'<li><a href="#'.$title.'">'.get_the_title().'</a></li>';
    }
    echo '</ul>';

    while ( $post_query->have_posts() ) {
      $post_query->the_post();
      $title = strtolower(get_the_title());
      $title = str_replace(' ', '-', $title);
      echo '<div id="'.$title.'">';
      echo '<div><button class="copy" id="'.$title.'" data-clipboard-text="'.get_the_content().'" title="Copy">Copy</button></div>';
      echo '<div>'.get_the_content().'</div>';
      echo '</div>';
    }

    wp_reset_query();
  }
?>

【讨论】:

  • 感谢您的回复,我认为是这样,但它只是没有重置,我已经尝试了您的代码,以防我可能错过了一些东西,但第二个循环仍然失败。
  • 也许您还需要调整第三个循环,因为您执行$featureThumb = new WP_Query(...),然后您执行while ($loop-&gt;have_posts()) : $loop-&gt;the_post();。您将实例保存在 $featureThumb 而不是 $loop。无论如何我建议你离开wp_reset_query()函数。
  • 对不起,我有点困惑,您建议我修改什么,所以更改$loop 变量名的名称?
  • 是的,在第三个循环中你应该使用while ($featureThumb-&gt;have_posts()) : $featureThumb-&gt;the_post();
  • 所以我已经更新了,如果我注释掉第一个循环,它仍然会显示,但是如果我带回第一个循环再次失败
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多