韩小栋
韩小栋
发布于 2026-02-10 / 6 阅读
0
0

Typecho 主题开发文档

Typecho 主题开发文档

1. 主题系统概述

Typecho 的主题系统基于 PHP 模板引擎,允许开发者通过创建模板文件来自定义博客的外观和布局。每个主题都是一个独立的目录,包含必要的模板文件和资源文件。

2. 主题目录结构

一个完整的 Typecho 主题通常包含以下文件和目录:

themes/
└── your-theme-name/
    ├── index.php          # 首页模板
    ├── archive.php        # 归档页模板(分类、标签、日期等)
    ├── post.php           # 文章详情页模板
    ├── page.php           # 独立页面模板
    ├── footer.php         # 页脚模板
    ├── header.php         # 页头模板
    ├── sidebar.php        # 侧边栏模板
    ├── functions.php      # 主题功能文件
    ├── style.css          # 主题样式表
    ├── screenshot.png     # 主题预览图
    └── assets/            # 静态资源目录(CSS、JS、图片等)

3. 模板文件详解

3.1 index.php (首页模板)

这是主题的主要模板文件,用于显示首页的文章列表:

<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php $this->need('header.php'); ?>

<div id="main">
    <?php while($this->next()): ?>
    <article class="post">
        <h2><a href="<?php $this->permalink() ?>"><?php $this->title() ?></a></h2>
        <div class="entry">
            <?php $this->content() ?>
        </div>
        <p class="meta">发布时间: <?php $this->date('Y-m-d'); ?></p>
    </article>
    <?php endwhile; ?>
    
    <?php $this->pageNav(); ?>
</div>

<?php $this->need('sidebar.php'); ?>
<?php $this->need('footer.php'); ?>

3.2 post.php (文章详情页)

用于显示单篇文章的详细内容:

<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php $this->need('header.php'); ?>

<div id="main">
    <article class="post">
        <h1><?php $this->title() ?></h1>
        <div class="entry">
            <?php $this->content(); ?>
        </div>
        <p class="meta">发布时间: <?php $this->date('Y-m-d H:i'); ?></p>
    </article>
    
    <?php $this->need('comments.php'); ?>
</div>

<?php $this->need('sidebar.php'); ?>
<?php $this->need('footer.php'); ?>

3.3 archive.php (归档页)

用于显示分类、标签、日期等归档内容:

<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<?php $this->need('header.php'); ?>

<div id="main">
    <h2><?php $this->archiveTitle(); ?></h2>
    
    <?php if ($this->have()): ?>
    <?php while($this->next()): ?>
    <article class="post">
        <h3><a href="<?php $this->permalink() ?>"><?php $this->title() ?></a></h3>
        <div class="entry">
            <?php $this->excerpt(200); ?>
        </div>
    </article>
    <?php endwhile; ?>
    <?php else: ?>
    <article class="post">
        <h2>没有找到内容</h2>
        <p>抱歉,没有找到相关内容。</p>
    </article>
    <?php endif; ?>
    
    <?php $this->pageNav(); ?>
</div>

<?php $this->need('sidebar.php'); ?>
<?php $this->need('footer.php'); ?>

4. 主题功能文件 (functions.php)

functions.php 文件用于为主题添加额外的功能,如主题配置、自定义函数等:

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

/**
 * 主题配置函数
 */
function themeConfig($form) {
    // 添加Logo URL配置
    $logoUrl = new \Typecho\Widget\Helper\Form\Element\Text(
        'logoUrl',
        null,
        null,
        _t('站点LOGO地址'),
        _t('在这里填入一个图片URL地址, 以在网站标题前加上一个LOGO')
    );
    $form->addInput($logoUrl->addRule('url', _t('请填写一个合法的URL地址')));

    // 添加侧边栏显示选项
    $sidebarBlock = new \Typecho\Widget\Helper\Form\Element\Checkbox(
        'sidebarBlock',
        [
            'ShowRecentPosts'    => _t('显示最新文章'),
            'ShowRecentComments' => _t('显示最近回复'),
            'ShowCategory'       => _t('显示分类'),
            'ShowArchive'        => _t('显示归档'),
            'ShowOther'          => _t('显示其它杂项')
        ],
        ['ShowRecentPosts', 'ShowRecentComments', 'ShowCategory', 'ShowArchive', 'ShowOther'],
        _t('侧边栏显示')
    );
    $form->addInput($sidebarBlock->multiMode());
}

/**
 * 自定义文章元信息显示函数
 */
function postMeta($archive) {
?>
    <ul class="post-meta">
        <li>作者: <?php $archive->author(); ?></li>
        <li>时间: <?php $archive->date('Y-m-d'); ?></li>
        <li>分类: <?php $archive->category(','); ?></li>
        <li>评论: <?php $archive->commentsNum('暂无评论', '1 条评论', '%d 条评论'); ?></li>
    </ul>
<?php
}

/**
 * 自定义字段添加函数
 */
function themeFields($layout) {
    $logoUrl = new \Typecho\Widget\Helper\Form\Element\Text(
        'logoUrl',
        null,
        null,
        _t('自定义LOGO地址'),
        _t('为这篇文章设置一个特殊的LOGO')
    );
    $layout->addItem($logoUrl);
}

5. 模板标签参考

5.1 基础标签

  • $this->title() - 显示文章标题
  • $this->permalink() - 显示文章固定链接
  • $this->content() - 显示文章全文
  • $this->excerpt() - 显示文章摘要
  • $this->date() - 显示文章发布日期
  • $this->author() - 显示文章作者
  • $this->category() - 显示文章分类
  • $this->tags() - 显示文章标签

5.2 系统标签

  • $this->options->title() - 显示站点标题
  • $this->options->siteUrl() - 显示站点URL
  • $this->options->themeUrl() - 显示当前主题URL
  • $this->options->description() - 显示站点描述
  • $this->options->keywords() - 显示站点关键词

5.3 分页标签

  • $this->pageNav() - 显示分页导航
  • $this->have() - 检查是否有内容
  • $this->next() - 循环遍历内容

6. 主题配置

主题可以通过 functions.php 中的 themeConfig 函数提供配置界面:

function themeConfig($form) {
    // 文本输入框
    $textInput = new \Typecho\Widget\Helper\Form\Element\Text(
        'textInput', null, '默认值', '标签文字', '描述文字'
    );
    $form->addInput($textInput);

    // 复选框
    $checkbox = new \Typecho\Widget\Helper\Form\Element\Checkbox(
        'checkbox', 
        ['option1' => '选项1', 'option2' => '选项2'], 
        ['option1'], 
        '复选框标题'
    );
    $form->addInput($checkbox->multiMode());

    // 下拉选择框
    $select = new \Typecho\Widget\Helper\Form\Element\Select(
        'select', 
        ['value1' => '显示文字1', 'value2' => '显示文字2'], 
        'value1', 
        '下拉框标题'
    );
    $form->addInput($select);
}

7. 主题开发最佳实践

7.1 安全性

  • 始终使用 <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; ?> 保护模板文件
  • 输出用户内容时使用 htmlspecialchars() 进行转义
  • 验证和过滤用户输入

7.2 性能优化

  • 合理使用 $this->need() 加载模板片段
  • 避免在模板中执行复杂计算
  • 压缩和合并CSS/JS文件

7.3 兼容性

  • 遵循Typecho的模板规范
  • 测试不同浏览器的兼容性
  • 保持向后兼容

8. 主题发布

发布主题前需要确保:

  1. 主题预览图 (screenshot.png) 存在且尺寸合适
  2. 主题信息在 functions.phpindex.php 中正确声明
  3. 主题在不同设备上正常显示
  4. 遵循Typecho的开源协议

评论