我在Wordpress支持上发现了这个问题,很遗憾,这个话题现在已经结束了。我也有同样的问题。。。(阅读下文)
我们创建了一个网站,会员可以在这里推荐喜欢的书籍、电影、歌曲等。对于这个问题,我将以电影页面为例。
“Movies”页面最终是一个自定义页面模板,它要求wordpress显示一个随机列表,列出所有被赋予“Movies”类别(类别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“记住”它在第1页上随机包含的10篇帖子,然后让它在第2页、第3页等上添加一组新的10篇帖子,直到所有帖子都显示出来。我想有只有一个每页出现一个帖子时,随机排序在10组。
SO网友:Nick Ryall
您可以使用筛选器修改WP\\U查询的ORDER BY语句。
这样,您可以手动将查询设置为使用ORDER BY RAND($seed);
Mysql RAND()接受种子作为可选参数。使用种子,每次都将返回相同的随机结果集。
因此,您可以在第一次页面加载时生成一个随机数,然后将其存储在会话变量中,并将其用作进一步分页请求的$种子。
例如,如果您试图在主循环中实现这一点,可以将以下内容添加到函数中。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;
}
SO网友:Guicara
自WordPress的最新版本以来,您现在可以在orderby
的参数WP_Query
:
$query = new WP_Query([
\'orderby\' => \'RAND(\' . $seed . \')\',
...
]);
$seed
是一个随机数。您应该将其存储为PHP会话变量。不要忘记在WordPress中通过调用
session_start()
在你身上
functions.php
:
if (!session_id()) {
session_start();
}
使用此语法,您不需要使用
posts_orderby
滤器此外,您不必确保过滤器仅应用于目标WP\\U查询。
有关更多信息,请阅读this ticket 在WordPress Core上。