12月10日
网站LOGO 六月是只猫 - 互联网技术分享指南
生活,一半家长里短,一半山川湖海...
菜单
  • 热评
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    Typecho一些常用的模板调用代码
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    www.lyszm.com

    Typecho一些常用的模板调用代码

    六月是只猫 · 原创 ·
    日常技术分享互联网 · 实用教程typecho
    共 16815 字 · 约 4 分钟 · 1935
    本文最后更新于2024年03月05日,已经过了280天没有更新,若内容或图片失效,请留言反馈
    一些Typecho常用的模板调用代码,如有需求可自行翻阅

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

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

    2.根据TAG调用相关文章:

    php 代码:
    <?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>

    3.上一篇与下一篇调用代码:

    php 代码:
    <?php $this->thePrev(); ?> <?php $this->theNext(); ?>

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

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

    5.全部标签列表,按照MID排序:

    php 代码:
    <?php $this->widget('Widget_Metas_Tag_Cloud')
    ->to($taglist); ?><?php while($taglist->next()): ?>
    <li><a href="<?php $taglist->permalink(); ?>" title="<?php $taglist->name(); ?>"><?php $taglist->name(); ?></a></li>
    <?php endwhile; ?>

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

    php 代码:
    <?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; ?>

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

    php 代码:
    function themeInit($archive) {
    if ($archive->is('index')) {
    $archive->parameter->pageSize = 10; // 自定义条数
    }
    }

    或者:

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

    8.调用某分类文章,pageSize是数量,mid是分类号:

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

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

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

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

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

    11.判断当前分类,输出内容:

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

    12.首页不显示某分类内容:

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

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

    将以下代码:

    php 代码:
    <?php $this->widget('Widget_Comments_Recent')->to($comments); ?>

    修改为:

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

    14.例如24小时内发布的贴,需要一个标志来完成。这里是用判断输入特殊字符,再用CSS判断完成:

    php 代码:
    /**
    * 判断时间区间
    *
    * 使用方法 if(timeZone($this->date->timeStamp)) echo 'ok';
    */
    function timeZone($from){
    $now = new Typecho_Date(Typecho_Date::gmtTime());
    return $now->timeStamp - $from < 24*60*60 ? true : false;
    }

    以上代码,加入到 functions.php 中,然后,在 index.php 中使用如下调用:

    php 代码:
    <?php if(timeZone($this->date->timeStamp)) echo ' new'; ?>

    注:这样就会输出一个new的文字,可应用于class里,然后,自定义输出背景图片等。

    15.自定义首页描述description文字内容:

    php 代码:
    <?php if($this->is('index')): ?>
    <?php $this->header('description=详细描述内容部分内容,自定义即可。'); ?>
    <?php else: ?>
    <?php $this->header(); ?><?php endif; ?>

    16.首页第一篇文章显示不一样:

    php 代码:
    <?php if (($this->_currentPage == 1) && ($this->sequence == 1)): ?>
    ... //首页第一篇文章
    <?php else: ?>
    ... //其它文章
    <?php endif; ?>

    17.导航菜单不显示某分类或某页面:

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

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

    php 代码:
    < 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>

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

    php 代码:
    /* 循环所有的分类 */
    <?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; ?>

    20.前台输出相关统计:

    php 代码:
    <?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>
    <p><?php _e('不烦恼的博客自 <strong>2011</strong> 年初建立以来,截至 %s 在已设定的 <strong>%s</strong> 个分类和 <strong>%s</strong> 个页面中,共发布了 <strong>%s</strong> 篇文章,并收到了 <strong>%s</strong> 条相关评论。', date('Y年n月j日G时i分'), $stat->categoriesNum, $stat->publishedPagesNum, $stat->publishedPostsNum, $stat->publishedCommentsNum); ?></p>

    21.调用单独页面评论代码,存在一个php,单独引用:

    php 代码:
    <?php
    /**
    * 单独页面调用评论列表
    */
    $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>";
    }
    //不需要结束标志,并空一行

    22.自定义pagenv分页盒样式:

    php 代码:
    <?php $this->pageNav('上一页文字', '下一页文字', '默认显示数目', '省略符号'); ?>

    23.创建自定义首页或页面模板:

    php 代码:
    <?php
    /**
    * 自定义首页模板
    *
    * @package index
    */
    
    <?php
    /**
    * 自定义页面模板
    *
    * @package custom
    */

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

    php 代码:
    <?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; ?>

    25.自定义首页keywords和Description内容:

    使用的是自定义的page模板做为首页,页page页面不输出关键词和描述。于是查阅了一下官方文档,得出以下结论,自定义这部分内容:
    打开 header.php 文件:

    php 代码:
    <?php $this->header(); ?>

    修改为:

    php 代码:
    <?php if($this->is('index')): ?>
    <?php $this->header('description=此处输入你的关键词'); ?>
    <?php else: ?>
    <?php $this->header(); ?><?php endif; ?>
    同样可应用于自定义category/page等方面,期待SEO更多优秀插件。

    26.站点名称

    php 代码:
    <?php $this->options->title() ?>

    27.站点网址

    php 代码:
    <?php $this->options ->siteUrl(); ?>

    28.站点说明

    php 代码:
    <?php $this->options->description() ?>

    29.文章/页面的作者

    php 代码:
    <?php $this->author(); ?>

    30.作者头像

    php 代码:
    < ?php $this->author->gravatar('40') ?>

    31.上下篇调用代码

    php 代码:
    <?php $this->thePrev(); ?>
    <?php $this->theNext(); ?>

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

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

    33.文章/页面评论数目

    php 代码:
    <?php $this->commentsNum('No Comments', '1 Comment' , '%d Comments'); ?>

    34.截取文章内容显示摘要(350 是字符数)

    php 代码:
    <?php $this->excerpt(350, '.. .'); ?>

    35.调用自定义字段

    php 代码:
    <?php $this->fields->fieldName ?>

    36.RSS 地址

    php 代码:
    <?php $this->options->feedUrl(); ?>

    37.获取最新评论列表

    php 代码:
        <?php $this->widget('Widget_Comments_Recent')->to($comments); ?>
        <?php while($comments->next()): ?>
            <li><a href="<?php $comments->permalink(); ?>"><?php $comments->author(false); ?></a>: <?php $comments->excerpt(50, '...'); ?></li>
        <?php endwhile; ?>

    38.分类名称(无链接)

    php 代码:
    <?php $this->category(',', false); ?>

    39.获取文章时间归档

    php 代码:
    
        <?php $this->widget('Widget_Contents_Post_Date', 'type=month&format=F Y')
                   ->parse('<li><a href="{permalink}">{date}</a></li>'); ?>

    40.获取标签集合

    php 代码:
    <?php $this->widget('Widget_Metas_Tag_Cloud', 'ignoreZeroCount=1&limit=28')->to($tags); ?>
    <?php while($tags->next()): ?>
    <a href="<?php $tags->permalink(); ?>" class="size-<?php $tags->split(5, 10, 20, 30); ?>"><?php $tags->name(); ?></a>
    <?php endwhile; ?>

    41.登陆与未登录用户展示不同内容

    php 代码:
    <?php if($this->user->hasLogin()): ?>
    //登陆可见
    <?php else: ?>
    //未登录和登陆均可见
    <?php endif; ?>

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

    php 代码:
    <?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; ?>

    43.文章字数统计

    php 代码:
    在 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 代码:
    <?php echo art_count($this->cid); ?>

    44.自动调用第 1 个文章图片

    php 代码:
    <?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;
    }
    ?>

    45.边栏不显示博主评论

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

    46.前台登录表单

    php 代码:
    <form action="<?php $this->options->loginAction()?>" method="post" name="login" rold="form">
    <input type="hidden" name="referer" value="<?php $this->options->siteUrl(); ?>">
    <input type="text" name="name" autocomplete="username" placeholder="请输入用户名" required/>
    <input type="password" name="password" autocomplete="current-password" placeholder="请输入密码" required/>
    <button type="submit">登录</button>
    </form> 

    47.评论增加楼层显示

    php 代码:
    <?php if($comments->levels == 0): ?>
    <?php if($comments->sequence == 1): ?>沙发
    <?php elseif($comments->sequence == 2): ?>板凳
    <?php elseif($comments->sequence == 3): ?>地毯
    <?php else: ?>
    第<?php  $comments->sequence(); ?>楼<?php endif; ?>
    <?php endif; ?>

    使用方法:放置在你的评论文件中评论列表循环处。

    48.根据文章访问量分等级

    php 代码:
    function Viewlevel($cid){
        $db = Typecho_Db::get();
        $exist = $db->fetchRow($db->select('str_value')->from('table.fields')->where('cid = ?', $cid))['str_value'];
    //这里需要将 str_value 修改成你的阅读量数据库字段
        if($exist<100){
            echo '<span>新文</span>';
        }elseif ($exist<300 && $exist>=100) {
            echo '<span>爽文</span>';
        }elseif ($exist<1000 && $exist>=300) {
            echo '<span>荐文</span>';
        }elseif ($exist<5000 && $exist>=1000) {
            echo '<span>热文</span>';
        }elseif ($exist<10000 && $exist>=5000) {
            echo '<span>头条</span>';
        }elseif ($exist<30000 && $exist>=10000) {
            echo '<span>爆文</span>';
        }elseif ($exist>=30000) {
            echo '<span>神贴</span>';
        }}
    调用代码:<?php Viewlevel($this->cid); ?>
    可以用在首页文章列表页显示,根据页面浏览量分为各种标签,或者也可以像我首页一样替换为图标等等

    49.实现那年今日功能

    php 代码:
    function _getHistoryToday($created){
        $date = date('m/d', $created);
        $time = time();
        $db = Typecho_Db::get();
        $prefix = $db->getPrefix();
        $sql = "SELECT * FROM `{$prefix}contents` WHERE DATE_FORMAT(FROM_UNIXTIME(created), '%m/%d') = '{$date}' and created <= {$time} and created != {$created} and type = 'post' and status = 'publish' and (password is NULL or password = '') LIMIT 5";
        $result = $db->query($sql);
        if($result instanceof Traversable) {
        foreach ($result as $item) {
        $item = Typecho_Widget::widget('Widget_Abstract_Contents')->push($item);
        $title = htmlspecialchars($item['title']);
        $permalink = $item['permalink'];
        echo "<li class='item'><a class='link' href='{$permalink}' title='{$title}'>{$title}</a></li>";}}}
    文章内调用:<?php _getHistoryToday($this->created) ?>
    全站内调用:<?php _getHistoryToday(time()) ?>

    可以实现调用去年、前年或者很多年前当天发布的文章。

    50.全站数据调用

    php 代码:
    <?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>
    文章总数:<?php $stat->publishedPostsNum() ?>篇
    分类总数:<?php $stat->categoriesNum() ?>个
    评论总数:<?php $stat->publishedCommentsNum() ?>条
    页面总数:<?php $stat->publishedPagesNum() ?>页

    51.实现功能后台开关按钮

    php 代码:
    function themeConfig($form){
        $test = new Typecho_Widget_Helper_Form_Element_Select('test',array(0=>'不开启',1=>'开启'),0,'测试功能','开启网站测试功能');   
        $form->addInput($test);}
    前台放入以下代码:
    <?php if($this -> options -> test == '1'): ?>
    这里可以放执行的代码、样式等内容
    <?php endif; ?>

    有些不常用的代码或者效果,可以自己加个开关在后台控制,免去每次加了再删除再添加的尴尬。

    52.给文件设置了密码,修改为 支付金额 查看效果

    修改文件:var/Widget/Abstract/Contents.php

    搜索:密码

    演示:

    php 代码:
    /** 处理密码保护流程 */
    if (!empty($value['password']) &&
    $value['password'] !== Typecho_Cookie::get('protectPassword') &&
    $value['authorId'] != $this->user->uid && 
    !$this->user->pass('editor', true)) {
        $value['hidden'] = true;
    
        /** 抛出错误 */
        if ($this->request->isPost() && isset($this->request->protectPassword)) {
            throw new Typecho_Widget_Exception(_t('对不起,您输入的金额太小'), 403);
        }
    }
    
    $value = $this->pluginHandle(__CLASS__)->filter($value, $this);
    
    /** 如果访问权限被禁止 */
    if ($value['hidden']) {
        $value['text'] = '<form class="protected" action="' . $this->security->getTokenUrl($value['permalink'])
            . '" method="post">' .
        '<p class="word">' . _t('请输入金额') . '</p>' .
        '<p><input type="password" class="text" name="protectPassword" />
        <input type="submit" class="submit" value="' . _t('支付') . '" /></p>' .
        '</form>';
    
        $value['title'] = _t('此内容付费后可查看');
        $value['tags'] = array();
        $value['commentsNum'] = 0;
    }
    
    return $value;
    }

    53.文章内链接在新窗口打开实现方式

    默认情况Typecho文章中如果有添加链接,那么是从当前窗口跳转的,并且外链没有添加nofollow标签,不利于SEO,Typecho文章内链接新窗口并添加nofollow标签如下。

    直接在主题里集成文章链接新窗口跳转,在function.php的添加

    php 代码:
    function parseContent($obj){
        $options = Typecho_Widget::widget('Widget_Options');
        if(!empty($options->src_add) && !empty($options->cdn_add)){
            $obj->content = str_ireplace($options->src_add,$options->cdn_add,$obj->content);
        }
        $obj->content = preg_replace("/<a href=\"([^\"]*)\">/i", "<a href=\"\\1\" target=\"_blank\">", $obj->content);
        echo trim($obj->content);
    }

    如果需要添加rel=nofollow,则如下

    php 代码:
    function parseContent($obj){
        $options = Typecho_Widget::widget('Widget_Options');
        if(!empty($options->src_add) && !empty($options->cdn_add)){
            $obj->content = str_ireplace($options->src_add,$options->cdn_add,$obj->content);
        }
        $obj->content = preg_replace("/<a href=\"([^\"]*)\">/i", "<a href=\"\\1\" target=\"_blank\" rel=\"nofollow\">", $obj->content);
        echo trim($obj->content);
    }

    然后需要修改主题 post.php 文件,将默认的内容输出

    php 代码:
    <?php $this->content(); ?>

    改成

    php 代码:
    <?php parseContent($this); ?>
    声明:本文由 六月是只猫(博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    现在已有

    1

    条评论
    发一条!
    1. 头像
      HL
      头像 HL
      • 等级:Lv.3
      • 角色:访客
      • 在线:很久之前

      网站换主题了?真心不错

      · · · 云南-昆明
    博客logo 六月是只猫 - 互联网技术分享指南 生活,一半家长里短,一半山川湖海... 51统计 百度统计
    MOEICP 萌ICP备20248888号 反诈联盟 公益反诈联盟成员单位 ICP 京ICP备2022028403号-1 ICP 京公网安备 11010502051304号 又拍云 本站由又拍云提供CDN加速/云存储服务

    🕛

    本站已安全运行 2 年 30 天 11 小时 40 分
    六月是只猫 - 互联网技术分享指南. © 2022 ~ 2024.
    网站logo

    六月是只猫 - 互联网技术分享指南 生活,一半家长里短,一半山川湖海...
     
     
     
     
    壁纸