整理一些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数量,显示固件文章
未完待续...
25 条评论
有没有首页或首页评论输出表情包的
dalao,加个我站的友链呗OωO
不同的主题代码不适应吧,
代码是知道了,就是怎么用还得研究研究,我也刚转过来。体验不错
收集不易,感谢分享
Typecho用的人没有WP多吧,?
肯定的,不是一个量级的。但是个人博客Typecho足够用,wp略显复杂,见仁见智了。
TY这一两年用的人是越来越多了!
是的,多数从wp转过来的。
typecho还有很多内容需要完善,需求的东西不太齐全
比如,你需要什么
懒于折腾,也就不想用那么多程序~~~
mark一下,后续会用到,博主好人
真是详细,我建了一个typecho站,可以用你这里现成的了。
要开始体验typecho了嘛。哈哈
很早之前折腾过typecho
看到了干货,收藏!
珍藏,以后用得到
不错,收集的蛮丰富的!
这种技术博客必须收藏
并不想把它定位为技术博客,因为我这三脚猫知识没法谈技术。前面这些文章只是折腾Typecho时候觉得有用的就记录一下。等折腾的差不多就得想想内容定位了。
这访问速度绝了,刷刷刷的快....主题好好看~
typecho和大局域网的功劳。