我在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 “记住”,随机抽取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;
}


评论


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

–Faisal Ramzan
19年11月11日13:39



#2 楼

从WordPress的最新版本开始,您现在可以将种子添加到orderbyWP_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