如何让分页适用于WordPress中的get_posts()?

2022-08-30 15:50:53

我正在一个WordPress网站上工作,我已经创建了一个页面模板,可以按类别slug显示帖子。为此,我为页面创建了一个字段,WP_Catid,并将其设置为与要显示帖子的类别 slug 相等。但是,我只希望每个页面显示五个帖子,并在这些帖子的底部显示分页链接。如何使分页链接正确显示?

我的代码如下:

<div id="container">
  <div id="content" role="main">
    <?php
      $btpgid=get_queried_object_id();
      $btmetanm=get_post_meta( $btpgid, 'WP_Catid','true' );
      $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

      $args = array( 'posts_per_page' => 5,
                     'category_name' => $btmetanm,
                     'paged' => $paged,
                     'post_type' => 'post' );

      $myposts = get_posts( $args );
      foreach ( $myposts as $post ) : setup_postdata( $post ); 
        echo "<div style='border:2px groove black; margin-bottom:5px;'><h3 class='btposth'>";
        the_title(); 
        echo "</h3><div class='btpostdiv'>";
        the_content();
        echo "</div></div>";
      endforeach; 
      next_posts_link( 'Older Entries'); //not displaying
      previous_posts_link('Newer Entries &raquo;'); //not displaying
      wp_reset_postdata();
    ?>
  </div><!-- #content -->
</div><!-- #container -->

答案 1

甜蜜而简短,如果您需要分页查询,请不要使用get_posts。 如果您要使用不需要分页的自定义查询,则可以完美地工作,但是当您需要引入分页时,它确实会变得非常复杂。get_posts

我认为这里最简单,最合适的方法是利用WP_Query来构造自定义查询,也就是说,如果您无法使用pre_get_posts来更改主查询以从主查询中获取所需的输出。

我确实认为next_posts_link()previous_posts_link()更适合与自定义查询一起使用,即.但是,您必须记住在使用自定义查询时设置参数,否则您的分页将中断WP_Query$max_pages

通过一些小的调整,您的查询应如下所示

<div id="container">
<div id="content" role="main">
<?php
$btpgid=get_queried_object_id();
$btmetanm=get_post_meta( $btpgid, 'WP_Catid','true' );
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$args = array( 'posts_per_page' => 5, 'category_name' => $btmetanm,
'paged' => $paged,'post_type' => 'post' );
    $postslist = new WP_Query( $args );

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


             echo "<div style='border:2px groove black; margin-bottom:5px;'><h3 class='btposth'>";
                 the_title(); 
             echo "</h3><div class='btpostdiv'>";
                 the_content();
             echo "</div></div>";

         endwhile;  

             next_posts_link( 'Older Entries', $postslist->max_num_pages );
             previous_posts_link( 'Next Entries &raquo;' ); 
        wp_reset_postdata();
    endif;
    ?>

</div><!-- #content -->
</div><!-- #container -->

答案 2

Pieter Goosen的回答是完全正确的,他建议改用,这是最有意义的。但是,我在寻找与循环外部的分页时偶然发现了这个问题,所以我认为这对其他人来说也可能是一个有用的选择:WP_Queryget_posts

get_posts具有称为 offset 的直接属性,其实现与 中几乎相同的操作;但是,其中指分页(例如 1、2、3),是您希望偏移查询的实际帖子数(例如 5、10、15)。通过一些数学 - - 您可以轻松获得正确的偏移量:pagedWP_QuerypagedoffsetnumberToShow * pageNumber

$paged = (get_query_var('paged')) ? get_query_var('paged') : 0;

$postsPerPage = 5;
$postOffset = $paged * $postsPerPage;

$args = array(
    'posts_per_page'  => $postsPerPage,
    'category_name'   => $btmetanm,
    'offset'          => $postOffset,
    'post_type'       => 'post'
);

$myposts = get_posts($args);

此示例中的初始值不是因为,当乘以 时,您希望初始偏移量而不是 。paged01posts_per_page05

如果您想要更精细的控制而不是直接的分页,这可能最方便,但与接受的答案中的循环结合使用应该同样有效。


推荐