【问题标题】:Why wp_query loop still considers hidden categories and 'post__not_in' in pagination?为什么 wp_query 循环仍然在分页中考虑隐藏类别和“post__not_in”?
【发布时间】:2015-09-28 14:57:22
【问题描述】:

我在同一页面上有三个循环。

  1. 第一个循环显示类别“突出显示”的最新帖子。
  2. 第二个循环按时间顺序显示同一类别的其他帖子。
  3. 第三个循环显示所有帖子,除了其他循环中的帖子。

一切正常,但在分页 (pagenavi) 中,max_num_pages 会考虑所有帖子,忽略“post__not_in”或“cat”等标准。

如果我使用这个循环,pagenavi 的最后一页仍然是空白的(计数隐藏的帖子,但不显示它们):

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

如果我使用这个循环(循环 3),pagenavi 的最后一页会显示“隐藏”的帖子:

if (have_posts()) : while (have_posts()) : the_post();

如何强制 wp_query 循环排除 max_num_pages 计数的隐藏帖子?

//loop 1

  <?php
  $loop1 = new WP_query(array(
  'category_name' => 'highlight',
  'posts_per_page' => 1,
  ));
  if($loop1->have_posts()) : $firstPosts = array(); while($loop1->have_posts()) : $loop1->the_post();
  $firstPosts[] = $post->ID;
  ?>

  <?php endwhile; ?>

  <?php wp_reset_postdata(); ?>

  <?php endif; ?>

//loop 2

  <?php
  $loop2 = new WP_query(array(
  'post__not_in' => $firstPosts,
  'category_name' => 'highlight',
  'posts_per_page' => 2,
  ));
  if($loop2->have_posts()) : while($loop2->have_posts()) : $loop2->the_post();
  $firstPosts[] = $post->ID;
  ?>

  <?php endwhile; ?>

  <?php wp_reset_postdata(); ?>

  <?php endif; ?>

//loop 3

  <?php
  $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
  $args = array(
  'post_type' => 'post',
  'paged' => $paged,
  'post__not_in' => $firstPosts,
  'cat' => -23,
  );
  $loop3 = new WP_Query( $args );
  if ($loop3->have_posts()) : while ($loop3->have_posts()) : $loop3->the_post();
  ?>

  <?php endwhile; ?>

  <?php wp_reset_postdata(); ?>

  <?php else:  ?>

  <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>

  <?php endif; ?>

//other stuff

//pagenavi

  <?php wp_pagenavi("", "", array(
    'query' => $loop3,
    'first_text' => 'lorem ipsum',
    'last_text' => 'lorem ipsum',
  )); ?>

【问题讨论】:

  • 您的代码中的哪个位置包含了寻呼机?
  • 嗨!我更新了主要问题中的代码。

标签: php loops pagination wordpress


【解决方案1】:

如果您使用的是 WP-PageNavi,则可以通过一种特殊的方式将其与自定义查询一起使用。例如:

$my_query = new WP_Query(
    array(
        'tag' => 'foo',
        'paged' => get_query_var('paged')
    )
);

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
    // more stuff here
endwhile;

wp_pagenavi( array( 'query' => $my_query ) );

wp_reset_postdata();    // avoid errors further down the page

因此,请确保将自定义查询对象传递给 wp_pagenavi() 函数调用。

~编辑~ 这是文档的链接:http://scribu.net/wordpress/wp-pagenavi/wpn-2-74.html

~编辑2~ 试试这个为您的特定应用程序定制的代码:

$args = array(
    'post_type' => 'post',
    'paged' => $paged,
    'post__not_in' => $firstPosts,
    'cat' => -23,
);
$loop3 = new WP_Query( $args );

...

wp_pagenavi( array( 'query' => $loop3 ) );
wp_reset_postdata();

【讨论】:

  • 我相信问题甚至出在循环上,因为当我禁用插件 pagenavi 并调用 max_num_page 的计数器时,寻呼机仍然计算隐藏的帖子。全局 $wp_query; echo $wp_query->max_num_pages;
  • 我想如果你打电话给$wp_query-&gt;max_num_pages,你会得到所有帖子的总数。这就是主循环的页数。 $loop3-&gt;found_posts 的输出是什么?
  • 您的解决方案(编辑 2)对我有用。循环在最后一个帖子处停止。但是有一个问题。我需要在 pagenavi 上的数组之前的“”、“”来调用第一个和 last_text 链接(转到最后一页)。任何的想法? (但谢谢,你帮了我很多!)
  • 如果我放 $loop3->found_posts,我会得到所有帖子的计数,没有例外。
  • 您可以更改插件管理中的第一个和最后一个链接文本吗?我从来没有真正使用过这个插件,但是对代码的简短浏览使它看起来像是在 CMS 中有一个设置,所以你不应该在函数中传递这些参数。另外,wp_pagenavi() 函数只接受一个选项数组,它不需要两个字符串值和一个选项数组。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多