Typecho文章输出图文版
Typecho作为一个轻量级blog程序,为的是优美流畅的文字表达(话说现在已经不是文字的年代了,图文并茂加视频是必须的),有些常用的调用,TE是不支持的,得我们自己写,比如“热门文章”、“热评文章”、“随机文章”,于是就写了一个“3合1”..
代码如下:
<?php
/*
* [函数15] zizPosts
*
* 功能:热门、热评、随机文章:并输出缩略图,可用作首页轮播推荐等。
* by zizdog
* 参数:
* $order_by 按照什么字段排序,可选'views'(浏览量),'comments'(评论数量),'rand'(随机)
* $show_metas 是否显示文章meta(标题、阅读数、评论数、日期等)
* $order_style 是否输出 排名顺序样式
* $num 输出文章数量
* $days 选取多少天内的文章进行排序
*/
function zizPosts($order_by='rand',$show_metas=true,$order_style=true,$num='4',$days='365'){
// 如果$order_by即不是'comments'也不是'views',就默认为'rand'(防止输入错误)
if (!($order_by == 'comments' || $order_by == 'views')){
$order_by = 'rand';
//既然是随机输出,那么$order_style(排序样式)自动为false
$order_style=false;
}
$time = time() - (24 * 60 * 60 * $days);
$order_div ='';
$order_num = 0;
$metas='';
$db = Typecho_Db::get();
$order_div = $order_style ? '<div class="icon_rank rank{order_num}">{order_num}</div>':'';
$metas = $show_metas ? '<div class="ziz-post-metas"><span>{title}</span><small>{views}阅读 {commentsNum}评论 , {date}</small></div>' : '';
$defaults = array(
'before' => '',
'after' => '',
'xformat' => '<div class="item">'.$order_div.'<a href="{permalink}" title="{title}"><div class="thumb lazy" data-src="{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 ($order_by == 'views'){
$posts = $posts->order('views',Typecho_Db::SORT_DESC);
}elseif($order_by == 'comments'){
$posts = $posts->order('commentsNum',Typecho_Db::SORT_DESC);
}else{
$posts = $posts->order('RAND()');
}
$posts = $db->fetchAll($posts);
if ($posts) {
echo $defaults['before'];
foreach ($posts as $post) {
$order_num++;
$result = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($post);
//$result = Typecho_Widget::widget('Widget_Abstract_Contents')->push($post);
$cid = $result['cid'];
$text = $result['text'];
//如果评论为0或浏览量小于10,不输出
if (($order_by == 'commentsNum') && ($result['commentsNum'] < 1)){
break;
}else if (($order_by == 'views') && ($result['views'] < 10)){
break;
}
//发现typecho1.3版本下$result['permalink']这种不能输出了,所以这里用Helper::widgetById来获取信息
$thepost=Helper::widgetById('Contents', $cid);
echo str_replace(
array('{permalink}', '{title}','{thumb_img}','{order_num}','{date}','{views}','{commentsNum}'),
array($thepost->permalink, $result['title'],thumb_by_cid($cid,640),$order_num,date('m-d',$result['created']),$result['views'],$result['commentsNum']),
$defaults['xformat']
);
}
echo $defaults['after'];
} else {
echo "<li>N/A</li>\n";
}
}
调用:
<?php zizPosts();?>
表示:随机输出最近一年的4篇文章
调用:
<?php zizPosts(‘views’);?>
表示:输出1年内5篇热门文章(浏览量最多的文章)(带排序、带文章信息)
调用:
<?php zizPosts(‘comments’,true,false,5,180);?>
表示:按评论数量输出180天内的5篇文章(带文章信息,不带排序样式)
注意!!
很明显,上面的代码中用到了文章访问量views字段和文章缩略图获取函数,这都不是typecho自带的,需要自己写(当然也可以用现有的插件来配套)。
文章浏览量功能
主体函数
/*
* [函数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) ?>
文章缩略图获取
函数主体
<?php function thumbById($cid){
$db = Typecho_Db::get();
$thumbs = $db->fetchRow($db->select('str_value')->from('table.fields')->where('name = ?', 'thumb')->where('cid = ?', $cid));
$texts = $db->fetchRow($db->select('text')->from('table.contents')->where('cid = ?', $cid));
if($thumbs && $thumbs['str_value']){
$thumb_url = $thumbs['str_value'];
}else{
if(preg_match_all('/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png|jpeg))/i', $texts['text'], $patternMDfoot)){
$thumb_url = $patternMDfoot[1][0];
}else if(preg_match_all('/\<img.*?src\=\"(.*?)\"[^>]*>/i', $texts['text'], $thumbUrl)){
$thumb_url = $thumbUrl[1][0];
}else if(preg_match_all('/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png|jpeg))/i', $texts['text'], $patternMD)){
$thumb_url = $patternMD[1][0];
}else{
$thumb_url = Typecho_Widget::widget('Widget_Options')->themeUrl. '/assets/img/thumb/thumb'.rand(1,10).'.jpg';
}
}
return $thumb_url;
}
调用实例
<img src="<?php echo thumbById($this->cid);?>" />
用作在文章面调用该文章缩略图
本文最后更新时间为 2024-10-11 14:28
本站仅用作个人记录,不交流、不讨论,留言板可以留言但无邮件回复。