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


30

我在Wordpress支持上发现了此问题,不幸的是,该主题现已关闭。我有同样的问题...(阅读下文)


我们创建了一个站点,成员可以在其中推荐诸如喜欢的书,电影,歌曲等内容。针对此问题,我将以“电影”页面为例。

“电影”页面最终是一个自定义页面模板,该模板要求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能够“记住”在第1页上随机包含10个帖子,然后让它在第2、3页上放置一组新的10个帖子,直到显示所有帖子。我希望每10个一组随机排序时,每页只有一个帖子出现。

Answers:


38

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

完美的解决方案。非常感谢
Faisal Ramzan

4

从WordPress的最新版本开始,您现在可以在的orderby参数值中添加种子WP_Query

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

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

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

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

有关更多信息,请在WordPress Core上阅读此票证


答案在技术上可能是正确的,但很糟糕。请编辑并解释原因,而不是将人们送往RTFM
Mark Kaplun

我已经编辑了答案,以解释为什么在这种特殊情况下,为什么不使用过滤器是一个更好的选择。
吉卡拉2015年

+1,但应使用Cookie代替会话。基本上不应该使用会话,因为它们在所有方面都存在问题。
马克·卡普伦'18

帮助了很多..谢谢
Faisal Ramzan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.