我有兴趣阅读关于如何正确分页随机排序帖子的问题的答案。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,但这对循环没有影响。上一篇文章中的函数将覆盖它。是否有一种方法可以将艺术家类别作为种子函数中的随机目标,而不使用其他循环。
谢谢
最合适的回答,由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
}