Typecho访问固定链接随机跳转到某一篇文章的方法


这算是个小功能吧。访问固定链接,每次打开都会随机跳转到某一篇文章。(不是随机文章列表!)
👇🏻举个栗子👇🏻下面的链接每次打开,都是不同文章。
随机文章

创建主题模板文件

打开服务器目录至/themes/当前模板文件夹下,创建一个新文件,如page.random.php

<?php
    /**
     * 随机一篇文章
     *
     * @package custom
     */
    if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
    <?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`)'];
    // 以上代码,是获取文章表里的最大文章id

    $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`)'];
    // 以上代码,是获取文章表里的最小文章id


    $result = NULL;
    while($result == NULL) {
        $rand_id = mt_rand($min_id,$max_id);
        // 以上代码,是获取最小值-最大值直接的id

        $sql = $db->select()->from('table.contents')
             ->where('status = ?','publish')
             ->where('type = ?', 'post')
             ->where('created <= unix_timestamp(now())', 'post')
             ->where('cid = ?',$rand_id);
        // 以上代码,根据随机id获取文章相关信息
        $result = $db->fetchAll($sql);
    }
    ?>

    <?php $target = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($result['0']); ?>
    <?php $this->response->redirect($target['permalink'],307); ?>
    //将结果307跳转

配置独立页面

登录后台,独立页面,新建,选择自定义模板"随机一篇文章"。保存,即可访问。

特殊需求

上述方法,会随机读取所有文章,但是有时候,有的分类下的文章,我并不想读取。或者说,我只想固定某一个、某两个分类下的文章。

于是,我重改了SQL的代码。
将上面 根据随机id获取文章相关信息 部分的代码,进行替换。其中 1,2,3,4,5 的位置,替换成你的分类ID,只有一个分类时,不需要逗号(英文状态下)。

$sql=$db->select() ->from('typecho_contents')
         ->join('typecho_relationships', 'typecho_contents.cid = typecho_relationships.cid', Typecho_Db::LEFT_JOIN)
         ->where('typecho_relationships.mid in (1,2,3,4,5)','1')
         ->where('typecho_contents.status = ?','publish')
         ->where('typecho_contents.type = ?', 'post')
         ->where('typecho_contents.created <= unix_timestamp(now())', '1')
         ->where('typecho_contents.cid = ?',$rand_id);

大功告成

复制独立页面的链接。即可使用。

举个栗子··· 随机文章

重定向说明

300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent)选择一项操作,或提供操作列表供请求者选择。

301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。

304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。

307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

声明:目的地-Destination|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Typecho访问固定链接随机跳转到某一篇文章的方法


前程似锦、未来可期、寻得良人、共赴白头,祝你也祝我。