轻扣指间,静听心声

Typecho文章输出图文版

发表于 09-11 / 117 阅读 / 0 评论 / 需时2.1’

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-04-18 00:09

已有0 条评论

    发表新评论