‘orderby’=>‘rand’替代方案以获得更好的性能?

时间:2021-09-18 作者:robert0

我被告知,在阵列中使用这个:

\'orderby\'  => \'rand\'
将导致:

随机排序的查询代价非常高昂,需要创建临时数据库表和扫描,因为它必须复制entireposts表,然后随机重新排序帖子,最后在销毁新表之前对新表进行实际查询。

我被告知:

在一个随机的日期之后,要求第一篇帖子要容易得多。

有人能详细说明一下吗?

是否有执行上述操作的数组代码行?

如果您有任何与此相关的资源,我们将不胜感激。

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

如果有什么需要的话;“随机”;最后一篇文章(或前一篇)将很好地回答这个定义。仅仅因为你知道它不是由随机算法生成的帖子,并不意味着它对用户来说不是随机的。

根本不可能有一个;“真的”;在讨论页面缓存之前,如果您关心性能,可以随机发布。

SO网友:Linnea Huxford

通过WordPress日期查询和wp_rand() 作用

对于wp_rand() 函数,您只需为其提供最小值和最大值。我们可以使用此函数返回当前时间和第一篇发布帖子的时间戳之间的随机时间戳。功能time() 将以unix时间戳的形式给出当前时间,这可能是您的最大数字。对于最小数量,可以使用第一篇发布文章的时间戳。

这个最小数字可以硬编码,因为它不太可能更改,但是如果您想运行查询来查找第一篇发布文章的时间戳,那么应该如下所示:

        $first_post_query = new \\WP_Query( [
            \'post_type\' => \'post\',
            \'post_status\' => \'publish\',
            \'posts_per_page\' => 1,
            \'orderby\' => \'date\',
            \'order\' => \'ASC\',
            \'ignore_sticky_posts\' => true,
            \'no_found_rows\'       => true,
        ] );
        $first_post = $first_post_query->posts[0];
        $min_time = strtotime( $first_post->post_date_gmt ) + 1;
现在我们有了一个最小值,我们可以计算一个随机时间戳并将其转换为如下日期:

        $random_timestamp = wp_rand( $min_time, time() );
        $random_date = date( \'m/d/Y H:i:s\', $random_timestamp );
此随机日期可在WP\\U查询中用于检索随机帖子:

        $query = new \\WP_Query( [
            \'post_type\' => \'post\',
            \'post_status\' => \'publish\',
            \'posts_per_page\' => 1,
            \'date_query\' => [
                \'before\' => $random_date,
            ],
            \'ignore_sticky_posts\' => true,
            \'no_found_rows\'       => true,
        ] );
        $random_post = $query->posts[0];
Theignore_sticky_postsno_found_rows 参数用于提高查询的性能。

我希望这个查询能够为一个有规则间隔内容的站点返回相当随机的帖子。例如,如果帖子在所讨论的时间段内每天都持续发布。然而,如果出版节奏不稳定,那么这将产生次优结果。

相关推荐

WordPress摘录-如何使用unctions.php删除第一个链接

我刚刚将一个博客导入Wordpress,所有内容都以以下内容开头:<a href="itunes.com">Listen on iTunes</a> 然后是段落内容,因此所有节选都显示为“;收听iTunes内容摘录"E;我尝试了这里的一些自定义函数,但似乎没有一个能起到作用。在不必移动iTunes链接的情况下删除Listen on iTunes文本的最佳方法是什么?例如,我试过这个。。。没有运气。。。 function custom_ex