随机文章在一定程度上是有利于SEO的抓取和更新的,Typecho自身并不带有随机文章的函数。
网上有一个随机文章的插件,但已经是2012年的代码。
其实,Typecho的随机文章是可以直接在模板代码里解决的。
网络上有一篇Typecho随机文章的代码《Typecho 随机文章(日志)函数》(http://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就可以很轻松地显示随机文章了。
下面给出老蒋的方案
代码如下
function getRandomPosts($limit = 10){
$db = Typecho_Db::get();
$result = $db->fetchAll($db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('created <= unix_timestamp(now())', 'post')
->limit($limit)
->order('RAND()')
);
if($result){
$i=1;
foreach($result as $val){
if($i<=3){
$var = ' class="red"';
}else{
$var = '';
}
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
$post_title = htmlspecialchars($val['title']);
$permalink = $val['permalink'];
echo '<li><i'.$var.'>'.$i.'</i><a href="'.$permalink.'" title="'.$post_title.'" target="_blank">'.$post_title.'</a></li>';
$i++;
}
}
}
这个代码直接添加到当前主题的Functions.php文件中。本来还是有一个随机插件的,这里我考虑到需要用到当天的时间所以不去用插件。
调用代码如下
<?php getRandomPosts('10');?>
在需要调用的位置调用随机文章。这里在文章标题中是没有时间的,我们可以在第一步的时候代码里加上时间,直接用date("Y/m/d")调用就可以了。
如果不会转换时间戳的,可以参考一下《PHP时间戳转换教程》