使用REWIND_POST()会导致分页中断

时间:2021-06-23 作者:Seblito

我正在开发一个使用Understrap的入门主题的网站。我想在家里使用拆分设计。php,其中最新帖子显示在其他帖子的顶部;“全宽”;而其余部分则位于下面的三列布局中。

幸亏this very helpful post 它工作完美无瑕。

然而,现在我有一个hard time getting the pagination to work 与经过修改的回路相结合。不做任何操作,分页显示在页面底部,但当我按下链接时,会出现相同的页面。

这是我的代码:

<?php

  $args = [
     \'posts_per_page\' => 10
  ];

  $q = new WP_Query($args);

  if ($q->have_posts()) {

     while ($q->have_posts()) {
        $q->the_post();

        if ($q->current_post < 1) { ?>

           <!-- start .banner -->
           <section id="banner" class="ts-75 bs-100">
              <div class="content">
                 <h1 class="banner-blog-title">
                    <a class="post-link" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                 </h1>
                 <p class="lead"><?php echo wp_trim_words(get_the_excerpt(), 40); ?></p>
                 <a href="<?php the_permalink(); ?>" class="btn btn-outline-secondary">Läs hela texten</a>
              </div>
              <a class="img-link half-w-lg" href="<?php the_permalink(); ?>">

                 <?php if (has_post_thumbnail()) : ?>
                    <img src="<?php the_post_thumbnail_url(\'blog_image\'); ?>" class="img-fluid fit-cover" alt="<?php echo $image_alt; ?>">
                 <?php endif; ?>

              </a>
           </section><!-- / .banner -->

    <?php
        }
     } ?>

     <hr class="hr-royal hr-royal-thick bs-100">
     <div class="card-section">
        <div class="row mx-lg-n5">

           <?php

           $q->rewind_posts();

           while ($q->have_posts()) {
              $q->the_post();

              if ($q->current_post >= 1 && $q->current_post <= 10) { ?>

                 <div class="col-md-6 col-xl-4 mb-5 px-lg-5">
                    <div class="card">
                       <div class="card-image-wrapper">
                          <a href="<?php the_permalink(); ?>">
                             <?php if (has_post_thumbnail()) : ?>
                                <img src="<?php the_post_thumbnail_url(\'blog_image\'); ?>" class="card-img-top fit-cover" alt="<?php echo $image_alt; ?>">
                             <?php endif; ?>
                          </a>
                       </div>
                       <div class="card-body">
                          <a href="#" class="card-post-date-link">
                             <div class="card-post-date">
                                <p class="card-post-date-text--lg"><?php the_time(\'d\'); ?></p>
                                <p class="card-post-date-text--sm"><?php the_time(\'M\'); ?></p>
                             </div>
                          </a>
                          <h4 class="card-title">
                             <a class="card-post-link" href="#"><?php the_title(); ?></a>
                          </h4>

                          <?php if (get_field(\'ingress\')) : ?>
                             <div class="lead-wrapper">
                                <p class="lead"><?php echo wp_trim_words(get_field(\'ingress\'), 32); ?></p>
                             </div>
                          <?php else : ?>
                             <p class="lead"><?php echo wp_trim_words(get_the_excerpt(), 24); ?></p>
                          <?php endif; ?>

                       </div>
                    </div>
                 </div>

        <?php

              }
           }

           // wp_reset_postdata(); // Initial reset
        } ?>

     </div>

   </div>

     <!-- This is where I try to continue the loop and retrieve the correct post data for pagination -->

    <?php

     $q->rewind_posts();

     while ($q->have_posts()) {
        $q->the_post();

        if ($q->current_post > 10) { ?>


     <?php understrap_pagination();
        }
        wp_reset_postdata();
     } ?>
感谢您的帮助!非常感谢。

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

这个问题与rewind_posts(). 同样的帖子出现在第2页的原因是因为你的模板只会显示10篇最新的帖子。这是因为您使用自己的辅助查询来显示帖子:

$args = [
   \'posts_per_page\' => 10
];

$q = new WP_Query($args);
这就是您的模板显示的查询,当您在第2页时,没有任何信息告诉它查询第二页的帖子。

问题是在家里。不应使用phpnew WP_Query() 为循环查询帖子。WordPress已经为您查询了正确的帖子,您可以使用The Loop.

您复制的解决方案之所以使用它,是因为它回答的原始问题显然是关于在静态主页模板上显示这些帖子,而该模板尚未查询到正确的帖子,因此不需要分页。

此外,原始答案使用的原因rewind_posts() 这是因为它似乎是为了无序显示不同组的帖子。那不是你想要的。您只需分别显示第一篇帖子,然后显示其余帖子,而不必重新显示第一篇帖子。

考虑到所有这些,正确的解决方案是使用此结构:

global $wp_query;

while ( have_posts() ) {
    the_post();

    // If we\'re on the first post.
    if ( 0 === $wp_query->current_post ) {
        // Display post as banner.
        break;
    }
}

// Display separator, open grid, etc.
while ( have_posts() ) {
    the_post();
    // Display post as card.
}

understrap_pagination();

SO网友:Harrison

我想试试这个,希望能有所帮助。我想这里发生了一些事情。

首先,我认为您可以完成布局,而无需回放循环。进行此更改将有助于澄清您的代码,并帮助我们隔离分页问题。请参阅下面发布的代码修订版,了解如何摆脱回放。基本上,当current_post 属性为1。

其次,我稍微改变了你的问题。我添加了“paged”参数。我还让它覆盖了全局$wp_query 变量这会欺骗wordpress,使其认为您的自定义查询是主查询,然后wordpress将相应地显示分页。你可以阅读this article 有关如何工作的更多信息。

我在本地机器上测试了下面的代码。我没有陷阱,所以我没有检查css是否正常,我不得不使用标准的wordpress分页功能,而不是understrap_pagination. 不过,html和导航功能似乎工作正常。

$args = [
     \'posts_per_page\' => 10,
     \'paged\' => get_query_var( \'paged\' ),
  ];
  global $wp_query;
  $wp_query = new WP_Query($args);

  if ($wp_query->have_posts()) {

    while ($wp_query->have_posts()) {
      $wp_query->the_post();

        if ($wp_query->current_post < 1) { ?>

           <!-- start .banner -->
           <section id="banner" class="ts-75 bs-100">
              <div class="content">
                 <h1 class="banner-blog-title">
                    <a class="post-link" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                 </h1>
                 <p class="lead"><?php echo wp_trim_words(get_the_excerpt(), 40); ?></p>
                 <a href="<?php the_permalink(); ?>" class="btn btn-outline-secondary">Läs hela texten</a>
              </div>
              <a class="img-link half-w-lg" href="<?php the_permalink(); ?>">

                 <?php if (has_post_thumbnail()) : ?>
                    <img src="<?php the_post_thumbnail_url(\'blog_image\'); ?>" class="img-fluid fit-cover" alt="<?php echo $image_alt; ?>">
                 <?php endif; ?>

              </a>
           </section><!-- / .banner -->

      <?php 
      } 
      if (1 === $wp_query->current_post ){ ?>
        <hr class="hr-royal hr-royal-thick bs-100">
        <div class="card-section">
          <div class="row mx-lg-n5">
        
       <?php 
      }
      if ($wp_query->current_post >= 1 && $wp_query->current_post <= 10) { ?>

          <div class="col-md-6 col-xl-4 mb-5 px-lg-5">
            <div class="card">
                <div class="card-image-wrapper">
                  <a href="<?php the_permalink(); ?>">
                      <?php if (has_post_thumbnail()) : ?>
                        <img src="<?php the_post_thumbnail_url(\'blog_image\'); ?>" class="card-img-top fit-cover" alt="<?php echo $image_alt; ?>">
                      <?php endif; ?>
                  </a>
                </div>
                <div class="card-body">
                  <a href="#" class="card-post-date-link">
                      <div class="card-post-date">
                        <p class="card-post-date-text--lg"><?php the_time(\'d\'); ?></p>
                        <p class="card-post-date-text--sm"><?php the_time(\'M\'); ?></p>
                      </div>
                  </a>
                  <h4 class="card-title">
                      <a class="card-post-link" href="#"><?php the_title(); ?></a>
                  </h4>

                  <?php if (get_field(\'ingress\')) : ?>
                      <div class="lead-wrapper">
                        <p class="lead"><?php echo wp_trim_words(get_field(\'ingress\'), 32); ?></p>
                      </div>
                  <?php else : ?>
                      <p class="lead"><?php echo wp_trim_words(get_the_excerpt(), 24); ?></p>
                  <?php endif; ?>

                </div>
            </div>
          </div>

<?php
      }
    }
    the_posts_navigation();
  } 
  wp_reset_query();
?>

        </div><!--.row mx-lg-n5-->
     </div><!--.card-section>-->

相关推荐

pagination leads to 404 page

我想弄明白为什么我的分页没有显示出来,我快发疯了。我将设置场景:我有一个页面“category.php”。在这个页面中,我为所有分类帖子设置了一个自定义查询。它们是自定义帖子类型,并显示该类别的自定义帖子。我的问题如下:我已经尝试过这个函数:the_post_pagination();$category = get_category(get_query_var(\'cat\')); if ( get_query_var(\'paged\') ) { $paged = get_query_var(