typecho判断是否第一篇文章并个性显示

发表于 2014-05-20   |   分类于 笔记
<?php if (($this->_currentPage == 1) && ($this->sequence == 1)): ?>
    ... //首页第一篇文章
<?php else: ?>
    ... //其它文章
<?php endif; ?>

比如可以用作第一篇全文显示,或者不同样式等..

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

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

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

发表于 2014-05-07   |   分类于 笔记

自定义分类、标签、搜索、首页等文章分页数量,修改 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; // 自定义条数
    }
}

Typecho中的is函数

发表于 2014-03-26   |   分类于 笔记

什么是is

Typecho中内置了强大的is函数,用于判断"我在哪里?"。在制作主题页面的时候,经常需要根据页面的位置来加设特殊的效果,比如在首页显示搜索框,但在归档页则显示最新评论:

<?php if($this->is('index')): ?>
  <?php $this->need('search_box.php');?>
<?php else: ?>
  <?php $this->need('comment_section.php');?>
<?php endif;?>

is真面目

var/Widget/Archive.php,Widget_Archive类定义了我们所使用的is函数,原型如下:

/**
     * 判断归档类型和名称
     *
     * @access public
     * @param string $archiveType 归档类型
     * @param string $archiveSlug 归档名称
     * @return boolean
     */
    public function is($archiveType, $archiveSlug = NULL)
    {
        return ($archiveType == $this->_archiveType ||
        (($this->_archiveSingle ? 'single' : 'archive') == $archiveType && 'index' != $this->_archiveType) ||
        ('index' == $archiveType && $this->_makeSinglePageAsFrontPage))
        && (empty($archiveSlug) ? true : $archiveSlug == $this->_archiveSlug);
    }

可见,is函数的第一个参数表示归档类型,第二个参数表示归档名称,其中第二个参数可选。

is可用于哪些判断?

is函数可以用于判断index/archive/category/tag/date/single/page/post/attachment等,具体用法见下文描述。注意哈,这些页面是有相互包含的关系的,具体在使用过程中要多尝试下。

$this->is('index')
从字面可见,判断当前页面是否是首页
$this->is('archive')
判断当前页面是否是归档页,譬如主页,分类文章页,标签文章页,日期归档文章页
$this->is('category'),或者$this->is('category','some_slug')
判断当前页面是否为分类文章页,如果加第二个参数slug,则进一步判断是否为特定的分类,譬如默认分类的slug是“default”
$this->is('tag')或者$this->is('tag','some_slug')
判断当前页面是否是标签文章页,如果加第二个参数slug,则进一步精确判断,原理同category
$this->is('date')或者$this->is('date','some_range'),其中some_rage可以是year/month/day
判断当前页面是否是日期归档页,如果指定第二个参数,则进一步精确判断。
$this->is('single')
用于判断是否是内容页面,所谓内容页面,包括文章页、独立页面和附件显示页
$this->is('post')或者$this->is('post',$post_id)
用于判断是否是内容页,加第二个参数则进行精确判断
$this->is('page')或者$this->is('page','some_slug')
用于判断当前页面是否为独立页面,加第二个参数表示精确判断,譬如
$this->is('page','about')则表示判断当前页面是否是about页面
$this->is('attachment')或者$this->is('attachment',$attachment_id)
同上,用于判断附件页面。

typecho单独输出tag链接地址

发表于 2014-03-26   |   分类于 笔记

可以单独输出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); ?>

typecho自定义字段使用说明

发表于 2014-01-26   |   分类于 笔记

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

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

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

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

其中fieldName设置为自定义的字段名

通过自定义字段我们可以让我们的文章页模板如虎添翼。让typeho博客变得强大,可以是相册、可以是下载站、可以是小说。

typecho自定义字段完全

abc 替换为你的自定义字段

<?php if (isset($this->fields->abc)): ?>
<?php $this->fields->abc(); ?>
<?php else: ?>
没有设置说明
<?php endif; ?>

说明

<?php if (isset($this->fields->abc)): ?>//如果有abc这个自定义字段
<?php $this->fields->abc(); ?>//输出自定义字段内容
<?php else: ?>//如果没有abc这个自定义字段
没有设置说明//如果没有设置时默认显示的内容
<?php endif; ?>//判断结束

直接输出自定义字段内容

abc 替换为你的自定义字段

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

通过自定义字段输出幻灯片

'pageSize=6&type=tag', 'slug=abc'
表示输出6条,标签缩略名为abc的内容。(幻灯片需要自行整合焦点图、幻灯片jQuery)
文字内容中自定义字段名为:banner

<ul>
    <?php $this->widget('Widget_Archive@indexfocus', 'pageSize=6&type=tag', 'slug=abc')->to($indexfocus); ?><?php while($indexfocus->next()): ?>
    <li><a href="<?php $indexfocus->permalink(); ?>"><img src="<?php if (isset($indexfocus->fields->banner)): ?><?php $indexfocus->fields->banner(); ?><?php endif; ?>" alt="<?php $indexfocus->title() ?>" /></a></li>
    <?php endwhile; ?>
</ul>

给typecho加上类似CMS焦点图轮播幻灯片功能

发表于 2013-12-26   |   分类于 笔记

如果我们要给自己Typecho加上一个焦点图轮播首先要活的文章图片

function img_postthumb($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));

   preg_match_all("/\<img.*?src\=\"(.*?)\"[^>]*>/i", $rs['text'], $thumbUrl);  //通过正则式获取图片地址
   $img_src = $thumbUrl[1][0];  //将赋值给img_src
   $img_counter = count($thumbUrl[0]);  //一个src地址的计数器

   switch ($img_counter > 0) {
       case $allPics = 1:
           echo $img_src;  //当找到一个src地址的时候,输出缩略图
           break;
       default:
           echo "http://baidu.com/404";  //没找到(默认情况下),不输出任何内容
   };
}

请添加到你模版文件夹中的【functions.php】文件中,直接往文件后面空白处插,,,

让typecho单独调用一个分类或者标签的文章列表

<ul>
<?php $this->widget('Widget_Archive@indexfocus', 'pageSize=6&type=tag', 'slug=focus')->to($indexfocus); ?><?php while($indexfocus->next()): ?> 
    <li><a href="<?php $indexfocus->permalink(); ?>" target="_blank"><img src="<?php echo img_postthumb($indexfocus->cid,4); ?>" alt="<?php $indexfocus->title() ?>" /><strong><?php $indexfocus->title() ?></strong></a></li>
<?php endwhile; ?> 
</ul>

这里用到的是标签,也可以用分类。

注意:typecho后台标签中添加一个标签【名称】可以是幻灯片也可以是焦点图,【缩略名】必须填focus(当然也可以填其它的但是要记得修改上面代码slug的值),然后编辑需要在博客展示焦点图轮播的文章【标签】写上刚才设置的标签名称。

参数解读:@indexfocus 作为标记可以随意修改,pageSize=6 其中6代表显示6张图也就是调最新的6个,type=tag 调用标签里的内容,slug=focus 标签中缩略名为focus的内容(也可以是cid=123 其中123代表标签的id,但是这样不科学),$indexfocus 代码片段有6个也是作为标记可以随意修改但是六个都要改到 而且不要和其它片段重复。

后台标签添加好,function.php文件修改好,(调用片段修改好,如果按要求这步可省略),然后代码片段放到你模板里焦点图轮换位置即可。

typehco自定头部header信息义

发表于 2013-12-26   |   分类于 笔记

首页keywords和Description内容:使用这样的代码,可以自定义相关header内容:

<?php if($this->is('index')): ?>
<?php $this->header('description=介绍内容。'); ?>
<?php else: ?>
<?php $this->header(); ?><?php endif; ?>

彻底删除Typecho模版中程序版本号、模版名称等多余Meta标签

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

请替换模版中<?php $this->header(); ?>,考虑SEO友好所以保留description及keywords如果其它有需求可以自行保留比如rss,一般都会在界面增加rss按钮一般可以为浏览器等工具提供探测。

基本用法:

keywords= (表示替换keywords标签内容,当"="后面没有内容则表示屏蔽调用,也就是删除)

& (处理多个时用到,如果有下一个需要屏蔽放下一个前面区隔开就可以了)
值解释:

内容描述/description: <meta name="description" content="随意" />
关键字/keywords:<meta name="keywords" content="随意" />
程序信息/generator:<meta name="generator" content="Typecho 0.9/13.12.12" />
模版名/template:<meta name="template" content="abc" />
文章引用/pingback:<link rel="pingback" href="https://abc.com/action/xmlrpc" />
离线写作接口/xmlrpc:<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://yijile.com/action/xmlrpc?rsd" />
离线写作接口/wlw:<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://abc/action/xmlrpc?wlw" />
Feed地址/rss2:<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="https://yijile.com/feed/" />
Feed地址rss旧版/rss1:<link rel="alternate" type="application/rdf+xml" title="RSS 1.0" href="https://yijile.com/feed/rss/"; />
Feed atom(应该可以说是比rss2兼容性更好吧)/atom:<link rel="alternate" type="application/atom+xml" title="ATOM 1.0" href="https://yijile.com/feed/atom/"; />
上面有提到当“=”后面没有内容就将值屏蔽了,如果“=”后面有内容就代替默认的

如:generator=Wordpress,那么前端调用后就是<meta name="generator" content="Wordpress" />
这样就伪装为wp了

typecho根据TAG调用相关文章

发表于 2013-11-15   |   分类于 笔记

根据TAG调用相关文章:

<?php $this->related(5)->to($relatedPosts); ?>
<ul>
    <?php while ($relatedPosts->next()): ?>
    <li><a href="<?php $relatedPosts->permalink(); ?>" title="<?php $relatedPosts->title(); ?>"><?php $relatedPosts->title(); ?></a></li>
    <?php endwhile; ?>
</ul>

typecho主题制作教程模板常用函数01

发表于 2013-11-11   |   分类于 生活志

模板常用函数

获取模板版本号

function get_theme_version()
{
 $info = Typecho_Plugin::parseInfo(__DIR__ . '/index.php');
 return $info['version'];
}

前台用<?php echo get_theme_version();?>来调用输出,用于给模板css和js添加属性。

themeInit重写函数

function themeInit($archive)
{
 Helper::options()->commentsMaxNestingLevels = 999;//评论回复楼侧最高999层.这个正常设置最高只有7层
 Helper::options()->commentsAntiSpam = false;//评论关闭反垃圾保护
if ($archive->is('author')) {
       $archive->parameter->pageSize = 50; // 作者页面每50篇文章分页一次
}
 if ($archive->is('category','av')) {
 $archive->parameter->pageSize = 9; // 分类缩略名为av的分类列表每9篇文章分页一次
}
 $archive->content = a_class_replace($archive->content);//文章内容,让a_class_replace函数处理
}
function a_class_replace($content)
{
  $content = preg_replace('#<a(.*?) href="([^"]*/)?(([^"/]*)\.[^"]*)"(.*?)>#',
        '<a$1 href="$2$3"$5 target="_blank">', $content);//给文章每个超链接点击后新窗口打开,原理就是用正则替换文章内容
}

文章阅读次数统计(cookie版)

function get_post_view($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;');
        echo 0;
        return;
    }
    $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
        }
    }
    echo $row['views'];
}

在需要显示次数的地方 (如 index.php,post.php,page.php) 加下边的代码<?php get_post_view($this) ?>,post和page里必须加否则阅读次数不会增加,如果不想显示,可以用css隐藏。

页面加载耗时代码

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() ?>

文章缩略图

function showThumbnail($widget)
{ 
    $mr = '默认图片地址'; 
    $attach = $widget->attachments(1)->attachment;
    $pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i'; 
if (preg_match_all($pattern, $widget->content, $thumbUrl)) {
         echo $thumbUrl[1][0];
    } elseif ($attach->isImage) {
      echo $attach->url; 
    } else {
        echo $mr;
    }
}

使用<?php showThumbnail($this); ?>调用。

随机文章

function theme_random_posts(){
$defaults = array(
'number' => 6,
'before' => '<ul class="archive-posts">',
'after' => '</ul>',
'xformat' => '<li class="archive-post"> <a class="archive-post-title" href="{permalink}">{title}</a>
 </li>'
);
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->limit($defaults['number'])
->order('RAND()');
$result = $db->fetchAll($sql);
echo $defaults['before'];
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($val);
echo str_replace(array('{permalink}', '{title}'),array($val['permalink'], $val['title']), $defaults['xformat']);
}
echo $defaults['after'];
}

前台调用<?php theme_random_posts();?>

自定义上下篇链接

/**
* 显示下一篇
*
* @access public
* @param string $default 如果没有下一篇,显示的默认文字
* @return void
*/
function theNext($widget, $default = NULL)
{
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('table.contents.created > ?', $widget->created)
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', $widget->type)
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_ASC)
->limit(1);
$content = $db->fetchRow($sql);

if ($content) {
$content = $widget->filter($content);
$link = '<a href="' . $content['permalink'] . '" title="' . $content['title'] . '">下一篇</a>';
echo $link;
} else {
echo $default;
}
}

/**
* 显示上一篇
*
* @access public
* @param string $default 如果没有下一篇,显示的默认文字
* @return void
*/
function thePrev($widget, $default = NULL)
{
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('table.contents.created < ?', $widget->created)
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', $widget->type)
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_DESC)
->limit(1);
$content = $db->fetchRow($sql);
if ($content) {
$content = $widget->filter($content);
$link = '<a href="' . $content['permalink'] . '" title="' . $content['title'] . '">上一篇</a>';
echo $link;
} else {
echo $default;
}
}

调用代码<?php thePrev($this); ?><?php theNext($this); ?>

N天内评论最多的文章

代码作用是N天内评论最多的N篇文章,这个N你可以自己定义,自己修改。

<?php
function rmcp($days = 30,$num = 5){
$defaults = array(
'before' => '<ul>',
'after' => '</ul>',
'xformat' => '<li><a href="{permalink}">{title}</a><span class="subcolor">已有评论数:{commentsNum}</span></li>'
);
$time = time() - (24 * 60 * 60 * $days);
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('created >= ?', $time)
->where('type = ?', 'post')
->limit($num)
->order('commentsNum',Typecho_Db::SORT_DESC);
$result = $db->fetchAll($sql);
echo $defaults['before'];
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($val);
echo str_replace(array('{permalink}', '{title}', '{commentsNum}'), array($val['permalink'], $val['title'], $val['commentsNum']), $defaults['xformat']);
}
echo $defaults['after'];
}
?>

模板调用<?php rmcp(60,5);?>这个调用的意思是2个月内评论最多的前5篇文章。

统计当前分类和子分类文章总数

typecho发布一篇文章,然后只勾选子分类,然后发布。
父分类输出分类的文章数量,并没有包含这个新发布的文章。所以有了以下函数

function fenleinum($id){
$db = Typecho_Db::get();
$po=$db->select('table.metas.count')->from ('table.metas')->where ('parent = ?', $id)->orWhere('mid = ? ', $id);
$pom = $db->fetchAll($po);
$num = count($pom);
$shu = 0;
for ($x=0; $x<$num; $x++) {
$shu=$pom[$x]['count']+$shu;
}
echo $shu;
}

前台调用,可以在分类列表循环中输入下面代码,分类mid需要根据自己的代码自填

<?php fenleinum(分类mid); ?>

typecho自定义Title部分

发表于 2013-11-07   |   分类于 笔记

自定义一下标题,以下为代码和参考案例:

<?php if($this->_currentPage>1) echo '第 '.$this->_currentPage.' 页 - '; ?><?php $this->archiveTitle('', '', ' - '); ?><?php $this->options->title(); ?>
<?php if($this->is('index')): ?> - 自定义关键词<?php endif; ?>

typecho博客信息前台调用

发表于 2013-10-03   |   分类于 分享

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

<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>

typecho首页不显示某分类

发表于 2013-08-09   |   分类于 笔记
<?php while($this->next()): ?>
<?php if($this->category != "cateslug"): ?>
//正常输出循环
<?php endif; ?>
<?php endwhile; ?>
© 2019 Powered by Typecho & Theme Quark