问题描述

我发现 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;
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。