如何在WordPress中为get_posts()工作?

B_T*_*man 19 php wordpress pagination

我正在使用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 -->
Run Code Online (Sandbox Code Playgroud)

Pie*_*sen 39

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 -->
Run Code Online (Sandbox Code Playgroud)

  • @RenéRoth是的,您可以,但是请记住,它仍然不能直接与get_posts一起使用,分页功能需要知道查询将拥有多少页,而get_posts不会返回。分页“ get_posts”并知道将有多少页的唯一方法是运行另一个“ get_posts”查询以返回*** all ***个帖子以对其进行计数,这反过来又昂贵又不必要。 (2认同)

ind*_*two 18

Pieter Goosen的回答是完全正确的,而他的使用建议WP_Query最有意义.然而,我偶然发现了这个问题,同时寻找get_posts循环外部的分页,所以我认为这也可能是其他任何人的有用选择:

get_posts有一个叫做直接财产offset,其实现了几乎同样的事情,pagedWP_Query; 但是在哪里paged引用分页(例如1,2,3),offset是你想要用你的查询抵消的实际帖子数量(例如5,10,15).通过一些小数学 - numberToShow * 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);
Run Code Online (Sandbox Code Playgroud)

paged此示例中的初始值0不是1因为,当乘以时posts_per_page,您希望初始偏移量0而不是5.

如果你想要更细粒度的控制而不是简单的分页,这可能是最方便的,但是在接受的答案中应该与循环结合使用.

  • 伟大的答案,考虑到这完全适用于无休止的滚动需要:) (3认同)
  • 没问题,你的答案仍然非常有效,是一个很好的选择;-) (2认同)

小智 5

尝试更改$ args:

$args = array( 
'posts_per_page' => 5,
'category_name' => $btmetanm,
'post_type' => 'post',
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 )
   );
Run Code Online (Sandbox Code Playgroud)

然后在循环之后放这个:

if (function_exists('wp_pagenavi')) {
wp_pagenavi();
}
Run Code Online (Sandbox Code Playgroud)