整理一些Typecho模板常用代码,代码收集自网络,以后陆续添加。

收集整理一些Typecho模板常用代码

博客信息

常用的一些博客信息调用:

    <?php if ($this->options->sidebarBlock && in_array('showSiteStatistics', $this->options->sidebarBlock)): ?>
        <section class="widgetbox">
            <h3><?php _e('网站统计'); ?></h3>
            <ul class="blogroll">
                <?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>
                <li><?php _e('文章总数:'); ?><?php $stat->publishedPostsNum() ?></li>
                <li><?php _e('分类总数:'); ?><?php $stat->categoriesNum() ?></li>
                <li><?php _e('评论总数:'); ?><?php $stat->publishedCommentsNum() ?></li>
                <li><?php _e('页面总数:'); ?><?php echo $stat->publishedPagesNum + $stat->publishedPostsNum; ?></li>
        </section>

加载时间

functions.php中加入以下代码:

    /**
     * 加载时间
     * @return bool
     */
    function timer_start() {
        global $timestart;
        $mtime     = explode( ' ', microtime() );
        $timestart = $mtime[1] + $mtime[0];
        return true;
    }
    timer_start();
    function timer_stop( $display = 0, $precision = 3 ) {
        global $timestart, $timeend;
        $mtime     = explode( ' ', microtime() );
        $timeend   = $mtime[1] + $mtime[0];
        $timetotal = number_format( $timeend - $timestart, $precision );
        $r         = $timetotal < 1 ? $timetotal * 1000 . " ms" : $timetotal . " s";
        if ( $display ) {
            echo $r;
        }
        return $r;
    }

然后,在模板中引用:

<?php echo timer_stop();?>

缩略图调用 img 字段

自动调用img字段内容,如果没有,去文章搜索第1个图片。

<?php if (array_key_exists('img',unserialize($this->___fields()))): ?><?php $this->fields->img(); ?><?php else: ?><?php
preg_match_all("/\<img.*?src\=(\'|\")(.*?)(\'|\")[^>]*>/i", $this->content, $matches);
$imgCount = count($matches[0]);
if($imgCount >= 1){
$img = $matches[2][0];
echo <<<Html
{$img}
Html;
}
?><?php endif; ?>

自定义面包屑导航

自定义 搜索或分类面包屑部分

<?php $this->archiveTitle(array(
            'category'  =>  _t('分类 %s 下的文章'),
            'search'    =>  _t('包含关键字 %s 的文章'),
            'tag'       =>  _t('标签 %s 下的文章'),
            'author'    =>  _t('%s 发布的文章')
        ), '', ''); ?>

自定义 header 部分

对header部分,进行新定义:

<?php $this->header('wlw=&xmlrpc=&rss2=&atom=&rss1=&template=&pingback=&generator'); ?>

首页摘要自动截取样式

带图片输出

<?php 
if(preg_match('/<!--more-->/',$this->content)||mb_strlen($this->content, 'utf-8') < 270)
{
$this->content('阅读全文...');
}
else
{ 
$c=mb_substr($this->content, 0, 270, 'utf-8');
echo $c.'...';
echo '</br><p class="more"><a href="',$this->permalink(),'" title="',$this->title(),'">阅读全文...</a></p>';
}
?>

不带图片输出:

<?php 
if(preg_match('/<!--more-->/',$this->content)||mb_strlen($this->content, 'utf-8') < 270)
{
$this->content('阅读全文...');
}
else
{ 
$c=mb_substr($this->content, 0, 270, 'utf-8');
$c=preg_replace("/<[img|IMG].*?src=[\'\"](.*?(?:[\.gif|\.jpg|\.jpeg|\.png|\.tiff|\.bmp]))[\'|\"].*?[\/]?>/","",$c);
echo $c.'...';
echo '</br><p class="more"><a href="',$this->permalink(),'" title="',$this->title(),'">阅读全文...</a></p>';
}
?>

截取代码部分输出:

<?php 
if(preg_match('/<!--more-->/',$this->content)||mb_strlen($this->content, 'utf-8') < 270)
{
$this->content('阅读全文...');
}
else
{ 
$c=mb_substr($this->content, 0, 270, 'utf-8');
$c=preg_replace("/<[img|IMG].*?src=[\'\"](.*?(?:[\.gif|\.jpg|\.jpeg|\.png|\.tiff|\.bmp]))[\'|\"].*?[\/]?>/","",$c);
if(preg_match('/<pre>/',$c))
{
echo $c,'</code></pre>','...';;
}
else
{
echo $c.'...';
}
echo '</br><p class="more"><a href="',$this->permalink(),'" title="',$this->title(),'">阅读全文...</a></p>';
}
?>

在文章中插入广告

其实就是判断查找文章的第一个p,然后,插入代码,放到functions里使用即可。

function themeInit($archive) {
   
   // 判断是否是文章,如果是就插入广告
   $ad_code = '<div>这是你的广告</div>';
   if ($archive->is('single')) {
        $archive->content = prefix_insert_after_paragraph( $ad_code, 2, $archive->content );;
    }
}

// 插入广告所需的功能代码
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
   $closing_p = '</p>';
   $paragraphs = explode( $closing_p, $content );
   foreach ($paragraphs as $index => $paragraph) {
      if ( trim( $paragraph ) ) {
         $paragraphs[$index] .= $closing_p;
      }
      if ( $paragraph_id == $index + 1 ) {
         $paragraphs[$index] .= $insertion;
      }
   }
   return implode( '', $paragraphs );
}

文章字数统计

functions.php中写入代码:

function  art_count ($cid){
$db=Typecho_Db::get ();
$rs=$db->fetchRow ($db->select ('table.contents.text')->from ('table.contents')->where ('table.contents.cid=?',$cid)->order ('table.contents.cid',Typecho_Db::SORT_ASC)->limit (1));
echo mb_strlen($rs['text'], 'UTF-8');
}

在模板中调用:

<?php echo art_count($this->cid); ?>

文章页TAG只输出名字

文章页面,只输入tag的名字,而没有链接。

<?php $this->tags(', ', false, 'none'); ?>

获取文章图片数量

/*****************
 * 获取图片数量
 * @since 2016.07.01
 **/
function hui_post_imgNum($content){
   $output =
   preg_match_all("/\]*>/i", $content,$matches);
   $cnt = count( $matches[1] );
       return $cnt;
}

调用方法:

<?php echo ''.hui_post_imgNum($this->content).'' ; ?>

自动调用第1个文章图片

<?php
preg_match_all("/\<img.*?src\=(\'|\")(.*?)(\'|\")[^>]*>/i", $this->content, $matches);
$imgCount = count($matches[0]);
if($imgCount >= 1){
    $img = $matches[2][0];
echo <<<Html
     <p class="post-images">
      <a href="{$this->permalink}" title="{$this->title}">
       <img src="{$img}" alt="{$this->title}">
      </a>
     </p>
Html;
}
?>

.htaccess文件

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L] 

判断域名调用不同表前缀

if($_SERVER["HTTP_HOST"]=="a.com" || $_SERVER["HTTP_HOST"]=="www.a.com"){
$db = new Typecho_Db('Mysql', 'a_');
}
else if($_SERVER["HTTP_HOST"]=="b.com" || $_SERVER["HTTP_HOST"]=="www.b.com"){
$db = new Typecho_Db('Mysql', 'b_');
}

typecho缩略图函数

在主题下functions.php文件中加入以下代码:

function thumb($cid) {
if (empty($imgurl)) {
$rand_num = 10; //随机图片数量,根据图片目录中图片实际数量设置
if ($rand_num == 0) {
$imgurl = "随机图片存放目录/0.jpg";
//如果$rand_num = 0,则显示默认图片,须命名为"0.jpg",注意是绝对地址
    }else{
$imgurl = "随机图片存放目录/".rand(1,$rand_num).".jpg";
//随机图片,须按"1.jpg","2.jpg","3.jpg"...的顺序命名,注意是绝对地址
}
}
 $db = Typecho_Db::get();
 $rs = $db->fetchRow($db->select('table.contents.text')
    ->from('table.contents')
    ->where('table.contents.type = ?', 'attachment')
    ->where('table.contents.parent= ?', $cid)
    ->order('table.contents.cid', Typecho_Db::SORT_ASC)
    ->limit(1));
$img = unserialize($rs['text']);
if (empty($img)){
    echo $imgurl;
}
else{
    echo '你的博客地址'.$img['path'];
}
}

模板处调用:

<?php echo thumb($this->cid); ?>

效果:如果有图片附件,就调用第1个图片附件,否则随机显示。

页面加载耗时代码

funcation.php中加入以下代码:

function timer_start() {
  global $timestart;
  $mtime = explode( ' ', microtime() );
  $timestart = $mtime[1] + $mtime[0];
  return true;
}
timer_start();
 
function timer_stop( $display = 0, $precision = 3 ) {
  global $timestart, $timeend;
  $mtime = explode( ' ', microtime() );
  $timeend = $mtime[1] + $mtime[0];
  $timetotal = $timeend - $timestart;
  $r = number_format( $timetotal, $precision );
  if ( $display )
    echo $r;
  return $r;
}

然后,模板部分加入:

<?php timer_stop() ?>

判断插件是否激活

模板部分,判断是否加载插件:

<?php $all = Typecho_Plugin::export();?>
<?php if (array_key_exists('插件名称', $all['activated'])) : ?>
...........
...........
<?php endif; ?>

调用后台添加的自定义字段

用以下方式来调用自定义字段,如果所有文章都包括自定义字段,则不用判断,直接调用:

<?php $this->fields->fieldName(); ?>

如果有些文章没有调用自定义字段,则判断一下,用来调用:

<?php if (isset($this->fields->fieldName)): ?><?php $this->fields->fieldName(); ?><?php endif; ?>

其中fieldName设置为自定义的字段名
php7临时解决方法:

<?php if (array_key_exists('img',unserialize($this->___fields()))): ?>

单独输出tag链接地址

可以单独输出tag地址,需要修改funcations.php文件

function tags($widget, $split = ',', $default = NULL)
{
    /** 取出tags */
    if ($widget->tags) {
        $result = array();
        foreach ($widget->tags as $tag) {
            $result[] = $tag['permalink'];
        }

        echo implode($split, $result);
    } else {
        echo $default;
    }
}

调用

<?php tags($this); ?>

新窗口打开评论者主页

\var\Widget\Abstract\夹下的Comments.php文件,找到

echo '<a href="' , $this->url , '"' , ($noFollow ? ' rel="external nofollow"' : NULL) , '>' , $this->author , '</a>';

修改为:

echo '<a href="' , $this->url , '"' , ($noFollow ? ' rel="external nofollow"' : NULL) , ' target="_blank">' , $this->author , '</a>';

获取分类描述

<?php echo $this->getDescription(); ?>

示例:

<?php $this->widget('Widget_Metas_Category_List')
->parse('<li><a href="{permalink}" title="{description}">{name}</a> ({count})</li>'); ?>

自定义某分类并输出缩略图

自定义调用某分类,并输出缩略图

<?php $this->widget('Widget_Archive@index', 'pageSize=4&type=category', 'mid=23')->to($indexpub); ?>
<?php while($indexpub->next()): ?>
    <?php $indexpub->permalink(); ?>
    <?php $indexpub->title() ?>
    <?php Fimg_Plugin::showfimg($indexpub->cid,4);?>
    <?php $indexpub->excerpt(80, '……'); ?>
<?php endwhile; ?>

自定义分页盒子样式

自定义pagenv分页盒样式

<?php $this->pageNav('上一页', '下一页', '5', '……'); ?>

更多细节:

<?php $this->pageNav('Newer', 'Older', 1, '...', array('wrapTag' => 'nav', 'wrapClass' => 'page-nav', 'itemTag' => '', 'prevClass' => 'extend prev', 'nextClass' => 'extend next', 'currentClass' => 'page-number current' )); ?>

单独调用评论列表

<?php
/**
 * 单独页面调用评论列表
 *
 * @author HeitaoSan
 * @link https://heitaosan.com
 */
$slug = "message";    //页面缩略名
$limit = 10;    //调用数量
$length = 30;    //截取长度
$ispage = true;    //true 输出slug页面评论,false输出其它所有评论
$isGuestbook = $ispage ? " = " : " <> ";
 
$db = $this->db;    //Typecho_Db::get();
$options = $this->options;    //Typecho_Widget::widget('Widget_Options');
 
$page = $db->fetchRow($db->select()->from('table.contents')
    ->where('table.contents.status = ?', 'publish')
    ->where('table.contents.created < ?', $options->gmtTime)
    ->where('table.contents.slug = ?', $slug));
 
if ($page) {
    $type = $page['type'];
    $routeExists = (NULL != Typecho_Router::get($type));
    $page['pathinfo'] = $routeExists ? Typecho_Router::url($type, $page) : '#';
    $page['permalink'] = Typecho_Common::url($page['pathinfo'], $options->index);
 
    $comments = $db->fetchAll($db->select()->from('table.comments')
        ->where('table.comments.status = ?', 'approved')
        ->where('table.comments.created < ?', $options->gmtTime)
        ->where('table.comments.type = ?', 'comment')
        ->where('table.comments.cid ' . $isGuestbook . ' ?', $page['cid'])
        ->order('table.comments.created', Typecho_Db::SORT_DESC)
        ->limit($limit));
 
    foreach ($comments AS $comment) {
        echo '<li>';
        echo '<a href="' . $page['permalink'] . "#comment-" . $comment['coid'] . '" title="' . $comment['text'] . '">';
        echo Typecho_Common::subStr(strip_tags($comment['text']), 0, $length, '...') . '</a>';
        echo '</li>';
    }
} else {
    echo "<li>No Comments</li>";
}
//不需要结束标志,并空一行

像CMS一样 - 输出所有分类+文章

像CMS那样,输出全部分类,并按分类输出文章:

/* 循环所有的分类 */
<?php $this->widget('Widget_Metas_Category_List')->to($categories); ?>
<?php while ($categories->next()): ?>
 
/* 循环当前分类下的文章 */
<?php $this->widget('Widget_Archive@category-' . $categories->mid, 'pageSize=7&type=category', 'mid=' . $categories->mid)->to($posts); ?>
<div class="posts">
    <?php while ($posts->next()): ?>
    <?php if (1 == $posts->sequence): ?>  //判断第一篇文章
    <h3>[<?php $categories->name(); ?>]:<a href="<?php $posts->permalink(); ?>"><?php $posts->title(43); ?></a></h3>
    <?php $posts->excerpt(120, '...'); ?>
    <ul class="post-list">  //文章列表
    <?php else: ?>
        <li>
            <a href="<?php $posts->permalink(); ?>"><?php $posts->title(40); ?></a>
            <span class="comment-num">(<?php $posts->commentsNum(); ?>)</span>
        </li>
    <?php endif; ?>
    <?php endwhile; ?>
    </ul>
</div>
<?php endwhile; ?>

输出全部分类,并对当前分类current标记

<ul id="nav_menu">
    <?php $this->widget('Widget_Metas_Category_List')->to($category); ?>
    <?php while ($category->next()): ?>
    <li<?php if ($this->is('post')): ?><?php if ($this->category == $category->slug): ?> class="current"<?php endif; ?><?php else: ?><?php if ($this->is('category', $category->slug)): ?> class="current"<?php endif; ?><?php endif; ?>><a href="<?php $category->permalink(); ?>" title="<?php $category->name(); ?>"><?php $category->name(); ?></a></li>
    <?php endwhile; ?>
</ul>

导航不显示某分类或页面

<?php while ($pages->next()): ?>
<?php while ($pages->next()): ?> //循环语句开始
<?php if ($pages->slug != 'about'): ?> // 记得闭合 if 语句
<?php if (($pages->slug != 'about') && ($pages->slug != 'links')): ?>

侧边栏不显示博主评论

Typecho侧边栏不显示博主评论,修改sidebar.php文件

<?php $this->widget('Widget_Comments_Recent','ignoreAuthor=true')->to($comments); ?>

首页不显示某分类

<?php while($this->next()): ?>
<?php if($this->category != "cateslug"): ?>
//正常输出循环
<?php endif; ?>
<?php endwhile; ?>

判断当前分类并自定义内容

可应用于自定义分类,或者,判断某些分类输出不同CSS。

<?php if($this->category == "help"): ?>
//当前分类为help缩略图,则输出内容。
<?php endif; ?>

判断是否为首页并自定义输出内容

判断是否为首页,输出相关内容:

<?php if($this->is('index')): ?>
//首页输出内容
<?php else: ?>
//不是首页输出内容
<?php endif; ?>

判断文章数量插入代码

判断为当前页的第几篇文章,并单独输出代码,可应用于第一篇文章底部广告:

<?php if ($this->sequence == 0): ?>
//需要的插入
<?php endif; ?>

调用自定义分类最新文章

调用某分类最新文章,pageSize是数量,mid是分类号:

<?php $this->widget('Widget_Archive@index', 'pageSize=6&type=category', 'mid=47')
->parse('<li><a href="{permalink}">{title}</a></li>'); ?>

自定义分类、搜索、首页文章数量

自定义分类、标签、搜索、首页等文章分页数量,修改functions.php文件:

function themeInit($archive) {
    if ($archive->is('index')) {
        $archive->parameter->pageSize = 10; // 自定义条数
    }
}
或者:
function themeInit($archive) {
    if ($archive->is('category', 'default')) {
        $archive->parameter->pageSize = 10; // 自定义条数
    }
}

全部标签列表 - 按文章数量排序

自定义标签数量(就这里面的20),按照文章数量排序:

<?php $this->widget('Widget_Metas_Tag_Cloud', array('sort' => 'count', 'ignoreZeroCount' => true, 'desc' => true, 'limit' => 20))->to($tags); ?>   
<?php while($tags->next()): ?>   
<li><a rel="tag" href="<?php $tags->permalink(); ?>"><?php $tags->name(); ?></a></li>
<?php endwhile; ?>

全部文章列表

全部文章列表,可应用于归档或网站地图,蜘蛛指引等

<?php $this->widget('Widget_Contents_Post_Recent', 'pageSize=10000')->parse('<li>{year}-{month}-{day} : <a href="{permalink}">{title}</a></li>'); ?>

也可以自定义page数量,显示固件文章

未完待续...

Reward this article