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

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

//  主题设置
function themeConfig($form) {}
//  文章字段
function themeFields($layout) {}
}

下面是facile主题(作者:misterma)里的的文章自定义字段的代码,摘录其中一部分作为示范,facile是个无边框的主题,纯粹利用文字大小、字体对齐以及文字色差组织出一个错落有致的页面,很佩服设计者的功力:

//  文章的自定义字段
function themeFields($layout) {
    // 文章列表显示设置
    $layout->addItem(new Typecho_Widget_Helper_Form_Element_Select('postListStyle', array(
        'default' => '使用系统设置',
        'fullText' => '文章列表直接显示全文',
        'summary' => '文章列表显示摘要和文章头图'
    ), 'default', _t('文章列表显示'), _t('文章列表包括首页、搜索页、归档 左侧的文章列表。在显示全文的情况下,文章列表不会显示文章头图,显示全文也支持使用 <b style="color: #C7254E;">&lt!--more--&gt</b> 来手动分隔摘要。')));

    // 文章头图显示设置
    $layout->addItem(new Typecho_Widget_Helper_Form_Element_Select('headerImgDisplay', array(
        'default' => '使用系统设置',
        'post-page-list' => '在文章列表和文章页显示文章头图',
        'post-list' => '只在文章列表显示文章头图',
        'post-page' => '只在文章页显示文章头图',
        'hide' => '不显示文章头图'
    ), 'default', _t('文章头图显示设置'), _t('您可以单独给文章设置文章头图显示。')));

    // 文章头图样式
    $layout->addItem(new Typecho_Widget_Helper_Form_Element_Select('postListHeaderImageStyle', array(
        'default' => '使用系统设置',
        'max' => '大图(文章头图在上方,标题和摘要在下方)',
        'mini' => '小图(文章标题和摘要在左侧,图片在右侧)'
    ), 'default', _t('文章列表的头图样式'), _t('您可以给文章设置单独的文章头图样式。大图的图片长宽比为 18 比 9,小图的长宽比为 4 比 3,如果图片长宽比不符合要求,主题会自动裁剪图片来适配长宽比。')));

    //  文章头图来源
    $layout->addItem(new Typecho_Widget_Helper_Form_Element_Select('imageSource', array(
        'article' => '使用文章中的第一张图片作为文章头图',
        'url' => '在文章头图输入框手动输入图片URL',
        'default' => '使用系统设置'
    ), 'article', _t('文章头图来源'), _t('如果选择了使用文章中的第一张图片作为文章头图,在文章不包含图片的情况下将不会显示文章头图。如果选择了使用系统设置,需要在主题设置的默认文章头图输入框填写图片 URL,系统会在默认文章头图中随机选择一个 URL 加载。')));
}

如果您之前尝试过为主题自定义一个设置页面,就会惊喜的发现,这几个new的语法不能说非常相似,简直就是一模一样。所以博主又要祭出deepseek,把自定义字段也写成一个类文件了。还是那句话,对于主题运行完全没有正向增益,纯粹就是添加删除项目的时候看着更舒服一点。

故技重施

一个用于设置文章自定义字段的类:

function themeFields($layout) {
    $settings = new Aug_Fields($layout);
    
    $settingsConfig = [
        //全局设置,参数顺序name、type、label、options、default、description 下同
        [
            '_Postthumb',
            'Select',
            _t('缩略图设置'),
           [],
            null,
            _t('修改站点的默认显示语言。')
        ]
    ];
    
    $settings->create_setting($settingsConfig);
}

if (!class_exists('Aug_Fields')) {

    class Aug_Fields {
        private $layout;
        public function __construct($layout) {
            $this->layout = $layout;
        }
        public function create_setting($items) {
            foreach ($items as $item) {
                $this->create_element($item);
            }
        }
        private function create_element($item) {
            $name = $item[0];
            $type = $item[1];
            $label = $item[2];
            $options = $item[3];
            $default = $item[4];
            $description = $item[5];
            $className = '\\Typecho\\Widget\\Helper\\Form\\Element\\' . $type;
            $element = new $className( $name, $options, $default, $label, $description );
            $this->layout->addItem($element);
        }
    }
}

博主的自定义字段里有一个缩略图选项,选项是由后台设置页里定义的参数Augpostthumbs提供的,所以在生成选项之前,还需要做一点与后台设置数据的交互,这里提供了一个演示。

function themeFields($layout) {
    $settings = new Aug_Fields($layout);
    
    $settingsConfig = [
        //全局设置,参数顺序name、type、label、options、default、description 下同
        [
            '_Postthumb',
            'Select',
            _t('缩略图设置'),
            $settings->thumbs,
            null,
            _t('修改站点的默认显示语言。')
        ]
    ];
    
    $settings->create_setting($settingsConfig);
}

if (!class_exists('Aug_Fields')) {

    class Aug_Fields {

        private $layout;

        public $thumbs; 

        public function __construct($layout) {
            $this->layout = $layout;
            $this->thumbs = ['' => '不使用缩略图'];
            $thumbs_lib = Helper::options()->Augpostthumbs;
            if ($thumbs_lib) {
                $thumb_arr = explode("\r\n", $thumbs_lib);
                foreach ($thumb_arr as $item) {
                    $name = explode("_" , $item)[0];
                    $value = Helper::options()->themeUrl.'/thumbs/'.$item;
                    $this->thumbs[$value] = $name;
                }
            }
        }
    
        public function create_setting($items) {
            foreach ($items as $item) {
                $this->create_element($item);
            }
        }

        private function create_element($item) {
            $name = $item[0];
            $type = $item[1];
            $label = $item[2];
            $options = $item[3];
            $default = $item[4];
            $description = $item[5];
            $className = '\\Typecho\\Widget\\Helper\\Form\\Element\\' . $type;
            $element = new $className( $name, $options, $default, $label, $description );
            $this->layout->addItem($element);
        }
    }
}

标签: 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-23

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

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

建站相关 typecho

thumbnail 2025-05-22

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

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

建站相关 typecho