Ryan

Typecho 随机跳转到一篇文章(手气不错)
文章很多时,读者不知道该看哪篇文章,我们可随机给读者显示一篇文章,在网上好的都是介绍如何在一个固定地方随机展示一下...
扫描右侧二维码阅读全文
22
2017/02

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

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

利用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); ?>
搬瓦工年付$187机房套餐补货了,电信联通优化,512M内存/500G流量/1G带宽,建站稳定,优惠码:BWH1ZBPVK,【点击购买】!
搬瓦工年付$28CN2高速线路,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快,建站稳定,优惠码同上,【点击购买】!
Last modification:March 2nd, 2018 at 01:43 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

6 comments

  1. Qing

    @Qing顺便再问下,Gravatar怎么让访问者下次回来时还保留显示在左边?

    1. Ryan
      @Qing

      通过cookies记录邮箱,渲染网页时读取并显示头像

  2. Qing

    我想咨询个问题:typecho 首页怎么实现用字段判断文章类型,比如输出正文,图片,视频,说说?

    1. Ryan
      @Qing

      推荐使用我写的插件实现https://github.com/benzBrake/ArticleTemplate

  3. 小夜

    请问,是在 functions.php 里面做修改吗?

    1. Ryan
      @小夜

      post.php index.php functions.php都可以啊,我是直接旺仔页面模板里的