我们创建了一个站点,会员可以在其中推荐喜欢的书,电影,歌曲等内容。为此,我将使用以“电影”页面为例。
“电影”页面最终是一个自定义页面模板,该模板要求wordpress显示随机分类的所有已被授予“电影”类别的帖子(类别31) 。它使用下面的代码以随机顺序显示这些电影的标题。
<?php
$rand = new WP_Query("cat=31&showposts=-1&orderby=rand");
while($rand->have_posts()) : $rand->the_post();
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>
问题是列表越来越长,我想将其分成两部分或更多的页面,每页大约10部电影。为此,我使用了下面的代码。
<?php
$page = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("cat=31&orderby=rand&showposts=10&paged=$page");
while ( have_posts() ) : the_post()
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>
但是有一个问题,因为尽管它将数据分成10个帖子的页面(分页),它无法在第2页上包含10个新帖子集,依此类推。换句话说,因为它以随机顺序列出事物,所以它刚出来并获得了另外10条随机帖子(在本例中为电影标题)。结果,我们有一些重复的电影标题帖子,而不是第2页上的一组10个新的随机电影标题,等等。
我的问题是-我可以在这段代码中添加些什么以获得wordpress “记住”,随机抽取10条帖子包含在第1页中,然后让它获得一组新的10条帖子放置在第2页,第3页等上,直到显示所有帖子。我希望每10个一组随机排序时,每页只有一个帖子出现。
#1 楼
您可以使用过滤器来修改WP_query的ORDER BY语句。这样,您可以手动设置查询以使用ORDER BY RAND($ seed);
Mysql RAND()接受种子作为可选参数。使用种子,它每次都会返回相同的随机结果集。
,因此您可以在第一页加载时生成一个随机数,然后将其存储在SESSION变量中,并将其用作$ seed进一步的分页请求。
例如,如果要在主循环上实现此请求,则可以将以下内容添加到functions.php文件中。
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 楼
从WordPress的最新版本开始,您现在可以将种子添加到orderby
的WP_Query
参数的值:$query = new WP_Query([
'orderby' => 'RAND(' . $seed . ')',
...
]);
$seed
是随机数。您应该将其存储为PHP会话变量。不要忘记通过在您的session_start()
中调用functions.php
来启用WordPress中的PHP会话:if (!session_id()) {
session_start();
}
使用此语法,您无需使用
posts_orderby
过滤器。此外,您不必确保仅将过滤器应用于目标WP_Query。有关更多信息,请在WordPress Core上阅读此票证。
评论
答案在技术上可能是正确的,但很糟糕。请编辑并解释原因,而不是将人们送往RTFM
–马克·卡普伦
17年7月21日在13:54
我已经编辑了答案,以解释为什么在这种特殊情况下,为什么使用过滤器可能是更好的选择。
–瓜卡拉(Guicara)
17年7月21日在14:16
+1,但应使用Cookie代替会话。基本上不应该使用会话,因为它们在所有方面都存在问题。
–马克·卡普伦
18年2月2日在7:16
帮助了很多..谢谢
–Faisal Ramzan
19年11月11日在13:39
评论
完美的解决方案。非常感谢
–Faisal Ramzan
19年11月11日13:39