Typecho 随机跳转到一篇文章功能实现(手气不错)

09/11/201718:25:33
评论
236

文章很多时,读者不知道该看哪篇文章,我们可随机给读者显示一下片文章,在网上好的都是介绍如何在一个固定地方随机展示一下文章,今天给大家分享一种可以直接进到某文章页面的随机跳转。

利用MySQL的随机排列
首先是随机查询一篇文章出来。

<?php
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
    ->where('status = ?','publish')
    ->where('type = ?', 'post')
    ->where('created <= unix_timestamp(now())', 'post')
    ->limit(1)
    ->order('RAND()');
$result = $db->fetchAll($sql);
?>

PS:307是临时跳转的状态码

利用PHP的随机函数
然而昨天发现MySQL的查询有缓存,所以上边的方法很可能多次查询出来的文章是同一篇。
所以换个思路,直接查询文章cid的大小范围,然后直接在这个范围内取随机数,然后检测该随机数是否在cid列中存在,若存在,该cid是否对应的是文章,如果是,输出结果,不是,继续随机。

<?php
$db = Typecho_Db::get();
$sql = $db->select('MAX(cid)')->from('table.contents')
    ->where('status = ?','publish')
    ->where('type = ?', 'post')
    ->where('created <= unix_timestamp(now())', 'post');
$result = $db->fetchAll($sql);
$max_id = $result[0]['MAX(`cid`)'];//POST类型数据最大的CID
$sql = $db->select('MIN(cid)')->from('table.contents')
    ->where('status = ?','publish')
    ->where('type = ?', 'post')
    ->where('created <= unix_timestamp(now())', 'post');
$result = $db->fetchAll($sql);
$min_id = $result[0]['MIN(`cid`)'];//POST类型数据最小的CID
$result = NULL;
while($result == NULL) {
    $rand_id = mt_rand($min_id,$max_id);
    $sql = $db->select()->from('table.contents')
        ->where('status = ?','publish')
        ->where('type = ?', 'post')
        ->where('created <= unix_timestamp(now())', 'post')
        ->where('cid = ?',$rand_id);
    $result = $db->fetchAll($sql);
}
?>

使用方法
$result[0]就是我们取到的一篇文章。
如果你想直接展示(例如在404页面),请使用

<?php _e($result[0]['content']) ?>

不过我是想实现手气不错的功能,然而数据库中没有直接保存文章的链接,只有SLUG,所以得通过Typecho的内置函数转换一下。

<?php $target = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($result['0']); ?>

最后跳转即可。

<?php $this->response->redirect($target['permalink'],307); ?>
Typecho 响应式博客主题 Echo 未分类

Typecho 响应式博客主题 Echo

Echo主题简介一套基于layui框架的Typecho主题Echo,主题名取自博客域名(www.echo.so)。主题极简美观,并进行了响应式布局,使博客在手机和平板电脑上也有更好的浏览阅读体验。主题...
Typecho 漂亮的单栏主题 Aria 未分类

Typecho 漂亮的单栏主题 Aria

主题简介书写属于自己的篇章,一款简洁漂亮的单栏Typecho博客主题Aria,具体样式大家可以看底部下载部分的作者演示站,总的来说算是一个功能比较完整的主题了,最主要是作者更新的相对来说比较勤。主题预...
Typecho 简约大图封面主题 Cola 未分类

Typecho 简约大图封面主题 Cola

主题简介这是由网友@可乐投稿的作品,主题采用了大图封面的单栏设计,整体看上去比较干净,不过该主题可以优化的细节之处还有很多,比如:1.评论样式有点粗糙 2.配色有点不够统一,特别是按钮触发的部分 3....
Typecho程序伪静态规则大全 开发日志

Typecho程序伪静态规则大全

Typecho程序的伪静态规则不同于wp直接默认可用,需要我们手工加载到空间中才可以生效。这里TypechoTips整理了一些不同的主机环境中的伪静态规则,希望对大家有所帮助!1、Linux Apac...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: