Typecho 文档:获取随机一篇文章数据,可指定可排除
适用程序:Typecho
程序版本:1.2.1
文档作者:Lopwon
作者博客:Lopwon.com
发布页面:Lopwon.com/attachment/3841/
许可方式:CC BY-NC-SA
注意:此文档源于作者在博客改造中的一些经验总结,转载还请署名。
敬告:此文档操作涉及程序核心文件的修改,作者不对你在使用中产生的任何问题造成的不良后果,承担责任。
文档说明
此功能提取自作者当前在用的主题 Lopwon v5 的首屏随机标题,即:随机一篇博客文章(标题 + 链接)。如果自定义了指定文章列表,则从其中随机一篇,反之,从所有公开的文章随机一篇,当然,可以设置排除哪些文章不参与。
使用方法
A 涉及文件
usr/themes/***/functions.php
B 改造文件
作用:随机一篇文章数据
1. 打开文件 usr/themes/***/functions.php 添加以下代码(留意注释,以及按需修改):
function getRandPost() {
$postArr = []; // 存储文章信息
$specifiedCids = [9, 99, 999]; // 自定义要指定的文章 cid 列表,可为空
if (!empty($specifiedCids)) { // 如果 $specifiedCids 指定了 cid 列表(即不为空),则从数据库获取这些文章信息(包含即将发布的公开的文章)
$db = Typecho_Db::get();
$posts = $db->fetchAll(
$db->select()
->from('table.contents')
->where('table.contents.type = ?', 'post') // 仅限类型为 post 的文章
->where('table.contents.status = ?', 'publish') // 仅限公开的文章
->where('table.contents.cid in ?', $specifiedCids) // 仅限指定 cid 的文章
);
foreach ($posts as $post) {
$post = Typecho_Widget::widget('Widget_Abstract_Contents')->push($post); // 获取指定的文章信息,主要为了获取 permalink 文章链接
$postArr[] = [
'cid' => $post['cid'], // 文章编号
'title' => $post['title'], // 文章标题
'permalink' => $post['permalink'] // 文章链接
// 可以根据需要获取文章内容、发布时间等信息
];
}
} else { // 如果 $specifiedCids 没有指定 cid 列表,则使用内置组件获取所有公开的文章信息(不含即将发布的文章)
Typecho_Widget::widget('Widget_Stat')->to($stat);
$publishedPostsNum = $stat->publishedPostsNum; // 获取所有公开的文章数量
$posts = Typecho_Widget::widget('Widget_Contents_Post_Recent@post', 'pageSize=' . $publishedPostsNum); // 获取所有公开的文章信息
$excludedCids = [6, 66, 666]; // 自定义要排除的文章 cid 列表,可为空
while ($posts->next()) {
if (in_array($posts->cid, $excludedCids)) { // 如果是排除的文章
continue; // 则跳过当前文章
}
$postArr[] = [
'cid' => $posts->cid, // 文章编号
'title' => $posts->title, // 文章标题
'permalink' => $posts->permalink // 文章链接
// 可以根据需要获取文章内容、发布时间等信息
];
}
}
if (!empty($postArr)) { // 如果文章信息数组不为空,则输出随机一篇文章信息
$randPost = $postArr[array_rand($postArr)]; // 随机选择一篇文章
echo '<a href="' . $randPost['permalink'] . '">' . $randPost['title'] . '</a>'; // 输出前端内容,根据需要自定义
} else {
echo '暂无文章';
}
}
至此,通过调用 getRandPost(); 即可显示随机一篇文章(标题 + 链接)。当然,也可以将以上扩展为更丰富的功能,比如:获取随机三篇,且提取文章内容中的图片,搭配开源组件,就能实现首屏幻灯片功能。