typecho 主题支持预填自定义字段名称

标题写的很绕口,稍微解释一下

typecho 自定义字段

typecho 有一个非常好用的扩展能力:自定义字段

自定义字段允许你为每篇文章赋予一组 Key&Value 的补充数据,在主题制作的时候可以有非常多灵活的应用,例如 “增加一个 type 字段,根据该字段的值来判断文章的类型,进而定义不同的展示逻辑”

更详细的使用方法参见官方文档:https://docs.typecho.org/help/custom-fields

为编辑器添加自定义字段的输入框

用上面的 “文章类型” 字段举例,typecho 官方的编辑器下方提供了自定义字段的输入框,如下图所示

typecho自定义字段输入框.png

使用自定义字段的时候,可以在字段名称处输入 “type”,字段值处输入类似于 “pic” 的类型名称

可是,如果主题里使用了好几个自定义字段,每次写文章都要一个一个的输入字段名称,非常不方便,就产生了 “预填自定义字段名称” 的需求,解决方案如下

在主题的 functions.php 文件中的新增 themeFields 函数

输入框类型

function themeFields($layout) {
    $type = new Typecho_Widget_Helper_Form_Element_Text('type', null, null, _t('文章类型'), _t('根据文章类型展现不同的样式'));
    $layout->addItem($type);  
}

显示效果如下
input类型typecho自定义字段.png

下拉框类型

function themeFields($layout) {
    $type = new Typecho_Widget_Helper_Form_Element_Select('type', array(
        '1' => 'talk',
        '2' => 'pic'
    ), '1', _t('选择文章类型'), _t('talk|微博,pic|图片'));
    $layout->addItem($type); 
}

显示效果如下
下拉框类型自定义字段.png

One More Thing

问了一下 ChatGPT,他的回答如下

要在 Typecho 主题中添加自定义字段的下拉框,您可以按照以下步骤进行操作:

1.在 functions.php 文件中添加一个函数,用于定义自定义字段。例如:

function themeFields($layout) {
    $my_field = new Typecho_Widget_Helper_Form_Element_Select('my_field', 
        array(
            'option1' => '选项1',
            'option2' => '选项2',
            'option3' => '选项3'
        ), 'option1', _t('自定义字段名称'), _t('自定义字段描述'));
    $layout->addItem($my_field);
}

这个函数将创建一个名为 my_field 的自定义字段,并将其定义为下拉框,其中包含三个选项:选项1、选项2 和选项3。您可以根据需要自定义选项的名称和值。

2.在您的主题模板文件中,使用以下代码获取自定义字段的值:

<?php $my_field = $this->fields->my_field; ?>

这将获取名为 my_field 的自定义字段的值,并将其存储在 $my_field 变量中。

3.在您的主题模板文件中,使用以下代码显示自定义字段的下拉框:

<select name="my_field">
    <?php foreach ($this->options->my_field->options as $value => $label): ?>
        <option value="<?php echo $value; ?>"<?php if ($my_field == $value) echo ' selected'; ?>><?php echo $label; ?></option>
    <?php endforeach; ?>
</select>

这将显示一个下拉框,其中包含自定义字段的选项。选项的名称和值将从 themeFields 函数中定义的数组中获取。如果自定义字段的值与选项的值匹配,则该选项将被选中。

请注意,这个示例代码中的 my_field 变量名需要与 themeFields 函数中定义的自定义字段名称相同。如果您使用了不同的名称,请相应地更改变量名。