当前位置: 首页>>技术解读>>正文


是否可以正确地对随机排序的帖子进行分页?

webfans 技术解读 , , 去评论

问题描述

我在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到”remember”,随机10个帖子包含在第1页,然后让它获得一组新的10个帖子放在第2,3页等,直到所有帖子显示。我希望当以10个为一组随机排序时,每页只发生一次帖子。

最佳解决方案

您可以使用过滤器来修改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;
}

次佳解决方案

从WordPress的最新版本开始,您现在可以将种子添加到WP_Queryorderby参数的值中:

$query = new WP_Query([
    'orderby' => 'RAND($seed)',
    ...
]);

$seed是一个随机数。您应该将其存储为PHP会话变量。不要忘记在functions.php中调用session_start()在WordPress中启用PHP会话:

if (!session_id()) {
    session_start();
}

使用此语法,您无需使用posts_orderby过滤器。此外,您不必确保过滤器仅应用于目标WP_Query。

有关详细信息,请阅读WordPress Core上的this ticket

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2703.html,转载请务必附带本地址声明。