Typecho作为一个轻量级blog程序,为的是优美流畅的文字表达(话说现在已经不是文字的年代了,图文并茂加视频是必须的),有些常用的调用,TE是不支持的,得我们自己写,比如“热门文章”、“热评文章”、“随机文章”,于是就写了一个“3合1”..
代码如下:
/*
* [函数10] ziz_posts
*
* 功能:热门、热评、随机文章:并输出缩略图,可用作首页轮播推荐等。
* by zizdog
* 参数:
* $isRand 是否随机输出内容
* $days 选取多少天内的文章进行排序
* $num 输出文章数量
* $isOrder 是否输出 排名顺序样式
* $orderBy 按照什么字段排序,如'views'(按照浏览量),'commentsNum'(按照评论数量)
* $showMetas 是否显示文章meta(标题、阅读数、评论数、日期等等...)
*/
function ziz_posts($isRand,$days,$num,$isOrder,$orderBy,$showMetas){
if($isRand==NULL){$isRand = false;}
if ($days==NULL){$days = 3650;}
if ($num==NULL){$num = 4;}
if ($isOrder==NULL){$isOrder = false;}
if ($orderBy==NULL){$orderBy = 'views';}
if ($showMetas==NULL){$showMetas = true;}
$time = time() - (24 * 60 * 60 * $days);
$orderDiv ='';
$orderNum = 0;
$metas='';
$db = Typecho_Db::get();
$orderDiv = $isOrder ? '<div class="icon-rank rank{orderNum}">{orderNum}</div>':'';
$metas = $showMetas ? '<div class="list-content"><span>{title}</span><small>{views}阅读 {commentsNum}评论 , {date}</small></div>' : '';
$defaults = array(
'before' => '',
'after' => '',
'xformat' => '<div class="item">'.$orderDiv.'<a href="{permalink}" title="{title}"><div class="thumb lazy" data-original="{thumb_img}"></div>'.$metas.'</a></div>'
);
$posts = $db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('created <= unix_timestamp(now())', 'post') //添加这一句避免未达到时间的文章提前曝光
->where('created >= ?', $time)
->limit($num);
if (!($isRand)){
$posts = $posts->order($orderBy,Typecho_Db::SORT_DESC);
}else{
$posts = $posts->order('RAND()');
}
$posts = $db->fetchAll($posts);
if ($posts) {
echo $defaults['before'];
foreach ($posts as $post) {
$orderNum++;
//$post = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($post);
$result = Typecho_Widget::widget('Widget_Abstract_Contents')->push($post);
$cid = $result['cid'];
$text = $result['text'];
if (!($isRand)){
if (($orderBy == 'commentsNum') && ($result['commentsNum'] < 1)){
break;
}else if (($orderBy == 'views') && ($result['views'] < 10)){
break;
}
}
$post_thumb = $db->fetchAll($db->select()->from('table.fields')
->where('cid = ?',$cid)
->where('name = ?', 'thumb')
->limit(1)
);
if($post_thumb && $post_thumb[0]['str_value']){
$thumb_url = $post_thumb[0]['str_value'];
}else{
if(preg_match_all('/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png|jpeg))/i', $text, $patternMDfoot)){
$thumb_url = $patternMDfoot[1][0];
}else if(preg_match_all('/\<img.*?src\=\"(.*?)\"[^>]*>/i', $text, $thumbUrl)){
$thumb_url = $thumbUrl[1][0];
}else if(preg_match_all('/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png|jpeg))/i', $text, $patternMD)){
$thumb_url = $patternMD[1][0];
}else{
$thumb_url = Typecho_Widget::widget('Widget_Options')->themeUrl. '/assets/img/thumb/thumb'.rand(1,10).'.jpg';
}
}
echo str_replace(
array('{permalink}', '{title}','{thumb_img}','{orderNum}','{date}','{views}','{commentsNum}'),
array($result['permalink'], $result['title'],$thumb_url,$orderNum,date('m-d',$result['created']),$result['views'],$result['commentsNum']),
$defaults['xformat']
);
}
echo $defaults['after'];
} else {
echo "<li>N/A</li>\n";
}
}
调用:
<?php ziz_posts();?>
表示:输出最近一年的4篇热门文章
调用:
<?php ziz_posts(false,180,5,false,'commentsNum',true);?>
表示:输出180天内前5篇评论最多的文章
调用:
<?php ziz_posts(true);?>
表示:随机输出4篇文章
注意
需要配合以下函数实现文章浏览量统计
/*
* [函数9] views
* 功能:统计文章浏览数 (利用cookie防止单一访问重复计数)
* 调用:<?php views($this) ?>
*/
function views($archive)
{
$cid = $archive->cid;
$db = Typecho_Db::get();
$prefix = $db->getPrefix();
if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
$db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');//默认0起步
return 0;
}
$row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid));
if ($archive->is('single')) {
$views = Typecho_Cookie::get('extend_contents_views');
if(empty($views)){
$views = array();
}else{
$views = explode(',', $views);
}
if(!in_array($cid,$views)){
$db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid));
array_push($views, $cid);
$views = implode(',', $views);
Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie
}
}
$views_num = $row['views'];
return $views_num;
}
统计执行
/**
* 主题初始化 thtmeInit
* 会在初始化皮肤函数时调用
*/
function themeInit($archive){
// 判断是否为文章或页面,如果是,调用浏文章览数计数函数views【函数】
if($archive->is('single')){
views($archive);
}
}
前端显示
<?php echo views($this) ?>
注意:randimg
为文章内无可用缩略图是,随机出处一张预置图片。
相关文章调用typecho原生就支持