分页不适用于页面,但适用于类别

时间:2020-05-28 作者:pagol

我使用的是kriesi分页,它可以很好地工作在分类页面上,但当我在页面上进行类似的查询时,它就不工作了。知道为什么吗?

function kriesi_pagination($pages = \'\', $range = 2){  
 $showitems = ($range * 2)+1;  
 global $paged;
 if(empty($paged)) $paged = 1;
 if($pages == \'\')
 {
     global $wp_query;
     $pages = $wp_query->max_num_pages;
     if(!$pages)
     {
         $pages = 1;
     }
 }   

 if(1 != $pages)
 {
     echo "<div class=\'pagination\'>";
     if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href=\'".get_pagenum_link(1)."\'>&laquo;</a>";
     if($paged > 1) echo "<a class=\'prev\' href=\'".get_pagenum_link($paged - 1)."\'>&lsaquo; Previous</a>";

     for ($i=1; $i <= $pages; $i++)
     {
         if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
         {
             echo ($paged == $i)? "<span class=\'current\'>".$i."</span>":"<a href=\'".get_pagenum_link($i)."\' class=\'inactive\' >".$i."</a>";
         }
     }

     if ($paged < $pages) echo "<a class=\'next\' href=\'".get_pagenum_link($paged + 1)."\'>Next &rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href=\'".get_pagenum_link($pages)."\'>&raquo;</a>";
     echo "</div>\\n";
 }
}

我的页面查询是

    <?php query_posts(array(\'category_name\' => \'m-directory\',
                          \'meta_key\'=> \'mno\',
                         \'orderby\'=> \'meta_value\',
                         \'order\'=> \'ASC\')); if ( have_posts() ) :
while ( have_posts() ) : the_post(); ?>       <li class="post">  
     ...
   </li>  <?php endwhile;  kriesi_pagination(); ?>     <?php else : ?> <p><?php _e(\'Sorry, no posts matched your criteria.\'); ?></p> <?php
endif;?>

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

它在分类页面上工作得非常好,但当我在页面上进行类似查询时,它就不工作了

我知道你为什么用query_posts() &mdash;分页功能(kriesi_pagination()) 使用主查询(全局$wp_query 变量)来获取查询的页数,因此您认为使用query_posts() 会使分页工作正常,对吗?

基本上是这样的。但您的查询参数缺少paged 参数(&M);更多详细信息here.

尽管如此,没有必要使用query_posts() 因为自定义分页函数实际上允许传递自定义页数,这是函数的第一个参数。

因此,只需创建WP_Query 并传递实例的$max_num_pages 属性(即。WP_Query::$max_num_pages) 分页功能:

$query = new WP_Query( [
    // .. your args here.
    \'paged\' => max( 1, get_query_var( \'paged\' ) ),
] );

if ( $query->have_posts() ) :
    while ( $query->have_posts() ) :
        $query->the_post();

        // .. your code.
    endwhile;
endif;

kriesi_pagination( $query->max_num_pages );

wp_reset_postdata();

每次创建自定义/辅助实例时的附加注释WP_Query and calls the_post() (或setup_postdata()), 一定要打电话wp_reset_postdata() 循环结束后,使全局$post 变量将还原回主查询中的当前帖子。否则,例如,下一次调用the_title() 要在主查询中显示当前帖子的标题,可以在上面的查询中看到最后一篇帖子的标题,而不是所谓的主查询。

您还应该知道,在分类/归档/搜索等“复数”页面上$wp_query->max_num_pages 值可以是2或更多,具体取决于主查询中的帖子总数和每页帖子设置(默认为10). 所以,如果“我的页面”是指一个页面(即page 类型),然后$wp_query->max_num_pages 永远都是1. 这可能就是“你知道为什么吗?”在问题中。

如果kriesi_pagination() 仍然不适合您,您可以尝试使用paginate_links():

echo paginate_links( [
    \'total\'   => $query->max_num_pages,
    \'current\' => max( 1, get_query_var( \'paged\' ) ),
] );
avoid using query_posts() 正如WordPress核心团队所建议的:

它修改主查询的过于简单的方法可能会有问题,应该尽可能避免。In most cases, there are better, more performant options for modifying the main query such as via the pre_get_posts action within WP_Query.

快乐的编码!