如何正确地对属于特定类别且随机排序的帖子进行分页

时间:2012-11-10 作者:Jonathan Beech

我有兴趣阅读关于如何正确分页随机排序帖子的问题的答案。Is it possible to paginate posts correctly that are random ordered?

我的目标是随机排序出现在我的网站上某个类别的帖子,在这里是艺术家。下面是循环的代码。在我的例子中,我使用wp\\u pagenvi插件

       <div class="news-posts">
    <?php
    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
    query_posts(\'cat=6&orderby=rand&posts_per_page=\'.get_option(\'posts_per_page\').\'&paged=. $paged);?>
    <?php wp_pagenavi(); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <div <?php post_class() ?> id="post-<?php the_ID(); ?>">
    <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
     <?php //include (TEMPLATEPATH . \'/inc/meta.php\' ); ?>
     <div class="entry">
         <?php
        global $more; $more = 0;
        the_post_thumbnail(\'medium\');
        the_content("Continue Reading",FALSE); 
         ?>
      </div>
       <div class="clear"></div>
    </div>
    <?php endwhile; ?>
    <?php //include (TEMPLATEPATH . \'/inc/nav.php\' ); ?>
    <?php wp_pagenavi(); ?>
    <?php else : ?>
    <h2>Not Found</h2>
    <?php endif; ?>
    <?php wp_reset_query(); ?>
我使用过滤器从上面的链接修改WP\\U查询的ORDER BY语句

session_start();

add_filter(\'posts_orderby\', \'edit_posts_orderby\');

function edit_posts_orderby($orderby_statement) {

$seed = $_SESSION[\'seed\'];
if (empty($seed)) {
  $seed = rand();
  $_SESSION[\'seed\'] = $seed;
}

$orderby_statement = \'RAND(\'.$seed.\')\';
return $orderby_statement;
}
在查看“艺术家”页面时,此操作非常有效。如前所述,在第一次页面加载时会生成一个随机数,然后将其存储在会话变量中,并用作进一步分页请求的$种子。这可以确保消除重复艺术家帖子的可能性,并在用户单击分页的第2页或第3页时返回一组新的艺术家帖子

然而,包括事件和新闻在内的不同类别的帖子也会被随机处理,这并不是人们想要的。

我希望这些是最新的。我尝试添加Orderized=DESC,但这对循环没有影响。上一篇文章中的函数将覆盖它。是否有一种方法可以将艺术家类别作为种子函数中的随机目标,而不使用其他循环。

谢谢

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

您可以使用add_filter 模板本身内部的行(&M);“functions.php”文件中没有过滤器。然后在检索帖子之后,通过调用remove_filter. 实际函数可能仍驻留在函数中。php文件

add_filter(\'posts_orderby\', \'edit_posts_orderby\');
// get all the posts for this specific loop here
remove_filter(\'posts_orderby\', \'edit_posts_orderby\');
这确保没有其他循环受到此筛选器的影响

如果要使用其他方法,可以将过滤器更改为接受2个参数,这里的第二个参数是相关的WP\\U查询对象。在该对象中,可以检查查询参数以确定是否应用过滤器

add_filter(\'posts_orderby\', \'edit_posts_orderby\', 10, 2);
function edit_posts_orderby($orderby_statement, $query) {
    if($query->get(\'cat\') != 6)
        return $orderby_statement;
    // apply the random seed here
}

结束

相关推荐