随机文章在一定程度上是有利于SEO的抓取和更新的,Typecho自身并不带有随机文章的函数。网上有一个随即文章的插件,但已经是2012年的代码。其实,Typecho的随机文章是可以直接在模板代码里解决的。
网络上有一篇Typecho随机文章的代码《Typecho 随机文章(日志)函数》(https://t.160.me/83.html),但是有未到达发布时间文章提前泄漏的bug,所以本文对代码进行了改进并优化了SEO。
先在模板的function.php中加入随机文章函数代码:
function theme_random_posts(){
$defaults = array(
'number' => 5,
'before' => '<ul class="list">',
'after' => '</ul>',
'xformat' => '<li><a href="{permalink}" title="{title}">{title}</a></li>'
);
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('created <= unix_timestamp(now())', 'post') //添加这一句避免未达到时间的文章提前曝光
->limit($defaults['number'])
->order('RAND()');
$result = $db->fetchAll($sql);
echo $defaults['before'];
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($val);
echo str_replace(array('{permalink}', '{title}'),array($val['permalink'], $val['title']), $defaults['xformat']);
}
echo $defaults['after'];
}
然后再需要调用随机文章的地方插入此代码(如sidebar.php):
<?php theme_random_posts();?>
这样,Typecho就可以很轻松地显示随机文章了。
后记:呵呵君在留言里这样说我就很尴尬了嘛~简单说一下方法吧。
可以将
'xformat' => '<li><a href="{permalink}" title="{title}">{title}</a></li>'
改成
'xformat' => '<li><a href="{permalink}" title="{title}">{title}</a><p>{text}</p></li>'
然后将
echo str_replace(array('{permalink}', '{title}'),array($val['permalink'], $val['title']), $defaults['xformat']);
改成
echo str_replace(array('{permalink}', '{title}', '{text}'),array($val['permalink'], $val['title'], cutArticle($val['text'],100)), $defaults['xformat']);
另外在function.php中增加一段将正文转成摘要的代码(COPY自https://blog.csdn.net/ei__nino/article/details/8675551):
function cutArticle($data,$cut=0,$str="....")
{
$data=strip_tags($data);//去除html标记
$pattern = "/&[a-zA-Z]+;/";//去除特殊符号
$data=preg_replace($pattern,'',$data);
if(!is_numeric($cut))
return $data;
if($cut>0)
$data=mb_strimwidth($data,0,$cut,$str);
return $data;
}
这样就ok了。今天太晚了就没有实际测试,以后有精力再完善吧。其实还可以实现相当多拓展,在theme_random_posts的foreach中加入一行var_dump($val)就可以看到能够调用的内容。
PS:最终还是逃不过copy啊哈哈哈