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为文章内无可用缩略图是,随机出处一张预置图片。