清源绿里

实现wordpress日志的随机显示

不少朋友喜欢 21percent 的摄影博客 Pars Sempre,大家常上来看看是否有更新,欣赏新拍的照片。但由于 Pars Sempre 的主题是个人博客风格,而非杂志型设置,因此首页设计以展示最新日志为主,而非内容的分类聚合,这样虽然能让老读者更方便得看到未曾阅读的信息,但对于初来乍到的朋友却很难深入得了解 Pars Sempre。从网站后台的浏览历史数据统计可以看出,即便是非常喜爱摄影的读者,也很少翻到以往的页面,最多向前翻两到三页便离开。为了让所有的内容都能够得到较好地发掘,让博客在分类及搜索显示时,打乱以时间为序、随机显示或许是一种解决方式。

Pars Sempre 是采用插件 Custom Query String 来实现博客各种查询的日志显示数目控制。这个插件可以设置日志的排序依据以及排序顺序。查看代码可以发现,排序依据为 orderby 参数、排序顺序为 order 参数。我原以为按照 Mysql 数据库的命令,只要在 order 上增加一个 rand() 选项即可。但 WordPress 的文档说明了 wp_post 这个参数是用 orderby 来实现日志的随机显示。这是什么逻辑……。

打开 Custom Query String 的文件,找到:

1
 var $orderbys = array('date','category','title','author');

修改为:

1
 var $orderbys = array('date','category','title','author','rand');

这时在 WordPress 的控制后台可以看到 CQS 排序选择中多了 rand 选项,将其选择即可实现该选项日志的随机显示。

请注意!到此会出现新的问题。如果在这样的情况下浏览博客,翻页时会出现不同页面的日志重复。究其原因应该是,在 page 1 时日志随机显示,当 page 2 时又是随机读取数据库,两个页面当然会有可能出现重复。我们需要的功能是 page 1 生成一个随机序列,而后面的页面则根据这个序列进行显示。对于 Mysql 数据库的查询命令来说非常容易实现,只要在 rand() 的括号中插入随机数的种子即可。但我查看 WordPress 源文件以后发现 rand() 已经被写死。再次无语……。打开 wp-includes 中的 query.php ,找到函数 function &get_posts() 中:

1
    $orderby = 'RAND()';

修改为:

1
2
 $int_random = date(m);
$orderby = 'RAND('.$int_random.')';

其中 $int_random 为以当前月份生成的随机数种子,这样就能实现每个月内的随机排序都是固定的,而下一个月将会有新的排序。该随机数种子可以随意设置,以日子、年份、固定的、变化的都行。具体效果请大家移步查看 Para Sempre 摄影 分类。

至于网络上很多朋友分享依靠修改 query_posts 来实现日志随机排序,依旧会出现上述翻页问题,也可以用本文修改 query.php 的方法来回避。

Leave a Comment