typecho里的 header() 与footer()

header 与 footer

类似于 WordPress 的 wp_head() 和 wp_footer() 钩子,Typecho 也提供了类似的插件钩子(如 header() 和 footer() 方法),允许插件在头部或尾部插入内容,当然有时候不想采用插件的形式,直接将语句写在主题里也是能够实现效果的。这两个函数定义在 var\Widget\Archive.php 文件内,有需要的可以去这里查看源码。

代码摘抄

header() 部分代码摘录:

    /**
     * 输出头部元数据
     *
     * @access public
     * @param string $rule 规则
     * @return void
     */
    public function header($rule = NULL)
    {
        $rules = array();
        $allows = array(
            'description'   =>  htmlspecialchars($this->_description),
            'keywords'      =>  htmlspecialchars($this->_keywords),
            'generator'     =>  $this->options->generator,
            'template'      =>  $this->options->theme,
            'pingback'      =>  $this->options->xmlRpcUrl,
            'xmlrpc'        =>  $this->options->xmlRpcUrl . '?rsd',
            'wlw'           =>  $this->options->xmlRpcUrl . '?wlw',
            'rss2'          =>  $this->_feedUrl,
            'rss1'          =>  $this->_feedRssUrl,
            'commentReply'  =>  1,
            'antiSpam'      =>  1,
            'atom'          =>  $this->_feedAtomUrl
        );

        /** 头部是否输出聚合 */
        $allowFeed = !$this->is('single') || $this->allow('feed') || $this->_makeSinglePageAsFrontPage;

        if (!empty($rule)) {
            parse_str($rule, $rules);
            $allows = array_merge($allows, $rules);
        }

        $allows = $this->pluginHandle()->headerOptions($allows, $this);
        $title = (empty($this->_archiveTitle) ? '' : $this->_archiveTitle . ' » ') . $this->options->title;

footer() 函数的代码:

    /**
     * 支持页脚自定义
     *
     * @access public
     * @return void
     */
    public function footer()
    {
        $this->pluginHandle()->footer($this);
    }

通过header()加载资源

这是小鸟数据 August 主题的资源加载类,供参考:

<?php
/*==========
August Setup
==========*/

if ( ! class_exists( 'Aug_Setup' ) ) {

    class Aug_Setup {

        private static $instance;

        public static function get_instance() {
            if ( ! isset( self::$instance ) ) {
                self::$instance = new self();
            }
            return self::$instance;
        }

        private $assetsCss=[
            'SwiperCss'      => 'swiper@3.4.2/swiper.min.css',
            'FontawesomeCss' => 'font-awesome@4.7.0/font-awesome.min.css',
            'FancyboxCss'    => 'fancybox@3.5.7/jquery.fancybox.min.css',
            'PrismCss'       => 'prism/prism.css'
        ];

        private $assetsJs=[
            'JqueryJs'       => 'jquery@1.12.4/jquery.min.js',
            'SwiperJs'       => 'swiper@3.4.2/swiper.jquery.min.js',
            'JqcloudJs'      => 'jqcloud@1.0.4/jqcloud-1.0.4.min.js',
            'LazyloadJs'     => 'lazyload@1.9.7/jquery.lazyload.min.js',
            'FancyboxJs'     => 'fancybox@3.5.7/jquery.fancybox.min.js',
            'QrcodeJs'       => 'qrcode@1.0/jquery.qrcode.min.js',
            'PrismJs'        => 'prism/prism.js'
        ];

        private function __construct() {
            $this->add_db_keys();
            Typecho_Plugin::factory('Widget_Archive')->header = [ $this , 'enqueue_styles'];
            Typecho_Plugin::factory('Widget_Archive')->header = function(){
                echo '<link type="text/css" rel="stylesheet" href="' . AUG_THEME_URI
                . '/style.css'
                . '?ver=' . AUG_THEME_VER . '"/>' . "\n";
            };
            Typecho_Plugin::factory('Widget_Archive')->header = [ $this , 'enqueue_scripts'];
            Typecho_Plugin::factory('Widget_Archive')->header = function(){
                if( Helper::options()->MathjaxJs ){
                    echo '<script type="text/javascript" src="' . Helper::options()->MathjaxJs . '"></script>' . "\n";
                }
                echo '<script type="text/javascript" src="' . AUG_THEME_URI 
                . '/assets/js/main.js'
                . '?ver=' . AUG_THEME_VER . '"></script>' . "\n";
            };
        }

        /* 添加数据库字段 */

        public function add_db_keys() {
            $db = Typecho_Db::get();
            $prefix = $db->getPrefix();
            try {
                if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')->page(1, 1)))) {
                    $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT DEFAULT 0;');
                }
                if (!array_key_exists('agree', $db->fetchRow($db->select()->from('table.contents')->page(1, 1)))) {
                    $db->query('ALTER TABLE `' . $prefix . 'contents` ADD `agree` INT DEFAULT 0;');
                }
            } catch (Exception $e) {}
        }

        /* 添加 Css 依赖 */

        public function enqueue_styles() {
            foreach ($this->assetsCss as $key => $value) {
                if (Helper::options()->$key) {
                    $assetsUrl = Helper::options()->$key;
                } else {
                    $assetsUrl = AUG_LIB_URI . '/' . $value;
                }
                echo '<link type="text/css" rel="stylesheet" href="' . $assetsUrl . '"/>' . "\n";
            }
        }

        /* 添加 Js 依赖 */

        public function enqueue_scripts() {
            foreach ($this->assetsJs as $key => $value) {
                if (Helper::options()->$key) {
                    $assetsUrl = Helper::options()->$key;
                } else {
                    $assetsUrl = AUG_LIB_URI . '/' . $value;
                }
                echo '<script type="text/javascript" src="' . $assetsUrl . '"></script>' . "\n";
            }
        }
    }
}

Aug_Setup::get_instance();

文章页的关键词与摘要

typecho会自动提取文章的一部分内容作为文章摘要,如果想要自定义摘要以及关键词,那么除了在文章页直接输出自定义内容外,还需要屏蔽掉 header() 函数内的默认内容,以下是 joe 主题这一部分的代码实现,有需要的可以参考代码进行自定义:

<?php if ($this->is('single')) : ?>
  <meta name="keywords" content="<?php echo $this->fields->keywords ? $this->fields->keywords : htmlspecialchars($this->_keywords); ?>" />
  <meta name="description" content="<?php echo $this->fields->description ? $this->fields->description : htmlspecialchars($this->_description); ?>" />
  <?php $this->header('keywords=&description='); ?>
<?php else : ?>
  <?php $this->header(); ?>
<?php endif; ?>

标签: typecho

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-06-08

聊聊html里的head部分

HTML文档的<head>部分是一个容器,用于包含文档的元数据(metadata)和链接到外部资源的信息,这些内容不会直接显示在网页上,但对网页的功能和表现至关重要。主要元素和功能1. 基础元素<title>:...

建站相关 typecho

thumbnail 2025-06-04

typecho前端实现站点语言的切换

前端修改的数据能及时反馈到后端,那当然需要一个前后端都可以无障碍读取的东西,所以最初是想要用localstorage,但发现php无法直接读取其值,所以就换成了cookie。前端通过js来设置参数值:document.cookie='...

建站相关 typecho

thumbnail 2025-06-02

typecho 主题中的模板与模块的概念

模板是 typecho 主题中一个重要的概念,我们说过typecho的极简主题可以只存在 index.php 这一个文件,但需要展现分类页的时候,typecho事实上会先去寻找名为 category.php 的分类页模板,文章页当然也...

建站相关 typecho

thumbnail 2025-06-02

typecho的几种常见的文章列表调用

处理好了header与面包屑,接下来就按照自己的需求自由发挥了,先放一个分类列表,再挑出一个喜欢的标签,自定义一个该标签下内容展示模块。Typecho 提供了多种文章循环方式,以下是常用的几种方法:标准文章循环<?php whi...

建站相关 typecho

thumbnail 2025-06-02

在typecho里实现面包屑导航

什么是面包屑导航面包屑导航是一种网站导航方式,通常在网站顶部显示,大多会放在站点header的下方,用于显示用户当前位置。 面包屑导航由导航元素构成,每个元素代表一个网站导航项,各个元素通常包含对应链接,供用户跳转。面包屑导航示例首页...

建站相关 typecho

thumbnail 2025-05-29

关于typecho中的路由知识

路由(Routing)是博客系统中将URL地址映射到具体处理逻辑的机制,它决定了当用户访问某个网址时,系统应该执行什么操作、显示什么内容。typecho站点一般都会开启伪静态,伪静态通过URL重写将"漂亮"的URL映射到实际的文件路径...

建站相关 typecho

thumbnail 2025-05-29

Typecho 模板中的翻译函数 _t 与 _e

在 Typecho 模板开发中,_t 和 _e 是用于国际化处理的函数,核心区别在于输出方式:"_t" 函数‌‌功能‌:获取翻译后的字符串但不直接输出,需结合 echo 使用。‌示例‌:<?php echo _t('欢迎语');...

建站相关 typecho

thumbnail 2025-05-26

typecho文章自定义字段的删除与修改

涉及数据库的操作,务必请提前做好备份!提前做好备份!!做好备份!!!小鸟数据的当前主题的缩略图字段命名为augPostThumb,这几天在尝试完善一下原有主题,下载了原站的数据库导入了测试站用于测试页面效果,测试主题的缩略图相关字段拟...

建站相关 typecho

thumbnail 2025-05-26

typecho的文章自定义字段的知识笔记

在typecho中,除了可以自定义设置项之外,我们也可以给文章自定义一些额外的字段,比如给文章编辑界面添加一个缩略图选项,或者增加一个keywords输入框,用来修改编辑当前内容页的关键词信息。// 主题设置 function th...

建站相关 typecho

thumbnail 2025-05-23

typecho前台无法注销用户的原因

尝试制作主题的时候遇到一个奇怪的问题,自定义主题前台死活注销不掉,以为是本地服务器软件配置问题(本地服务器表示锅我不背),结果换其他主题一换一个正常。仔细检查了一下代码,发现是自己复制粘贴代码的时候在退出登录的按钮上也添加了noope...

建站相关 typecho

thumbnail 2025-05-22

typecho主题的页眉header部分常用代码

网站页眉(Header)是网页顶部固定区域,包含网站核心导航和品牌标识,通常由Logo、主导航菜单、搜索框、实用工具(如登录/注册、购物车)和联系方式等组成。其特点是保持全站一致性、固定显示、响应式设计并强化品牌形象,设计需简洁明了、...

建站相关 typecho