末尾有2022-04-21更新内容
情况
- 原版Typecho的description和keywords标签无法自定义,对SEO不够友好。
- Handsome版本:8.4.0
- Typecho版本:1.2.0
操作
修改文章撰写页自定义字段菜单
- 打开
usr/themes/handsome/functions_mine.php
文件,在第676行(function themeFields(Typecho_Widget_Helper_Layout $layout)
函数内即可)增加如下代码:
$description = new Typecho_Widget_Helper_Form_Element_Text('description', NULL, NULL, _t('描述'), _t('简单一句话描述'));$description->input->setAttribute('class', 'text w-100');
$layout->addItem($description);
$keywords = new Typecho_Widget_Helper_Form_Element_Text('keywords', NULL, NULL, _t('关键词'), _t('多个关键词用英文下逗号隔开'));$keywords->input->setAttribute('class', 'text w-100');
$layout->addItem($keywords);
- 如图:
解释
- 就是在原来的菜单最前面加上description和keywords两个菜单项
修改修改Typecho内容文章基类的description和keywords来源
- 打开
var/Widget/Archive.php
文件,在第1071行($allows = [...]
后一行)增加如下代码:
if(!is_null($this->fields->description)){
$allows['description'] = $this->fields->description;
}
if(!is_null($this->fields->keywords)){
$allows['keywords'] = $this->fields->keywords;
}
- 如图:
解释
- 大概原理是如果为空就使用默认的description和keywords标签,不为空就使用文章撰写时设置的标签
完成
- 现在去刷新即可看到效果
2022-04-21 更新
情况
- 经反馈存在首页description和keywords存在问题,会自动获取第一页文章最后一篇文章的description和keywords。
- 上一个方法是直接修改的Typecho源码,这次增加个修改Handsome源码的方法。
操作
修复首页description和keywords显示BUG
- 其实很简单,加个首页判断就好。
- 这里顺带加了个标签和分类判断。
- 官方文档如下:神奇的is语法 - Typecho Docs
具体方法
- 打开
var/Widget/Archive.php
,在与上文同样的位置将增加的代码改为如下即可:
if(($this->is('index') == False)AND($this->is('tag') == False)AND($this->is('category') == False)){
if((!is_null($this->fields->description))AND(strcmp($this->fields->description,'') != 0)){
$allows['description'] = $this->fields->description;
}
if((!is_null($this->fields->keywords))AND(strcmp($this->fields->keywords,'') != 0)){
$allows['keywords'] = $this->fields->keywords;
}
}
解释
- 增加了一个判断语句判断当前页面是否首页/标签/分类,非首页、标签和分类才执行。
- 再增加了一个判断语句判断description和keywords是否为空字符串,如果是空字符串也使用原方法。
修改Handsome源码的方法
- 经过简单测试没有问题,实际使用请自测。
- 已经修复一开始提到的首页BUG。
- 没加标签和分类判断,参考上面的代码看着加就是了,用
AND
连接。 - 参考
header.php
使用官方文档:自定义头部信息输出 - Typecho Docs
具体方法
- 打开usr/themes/handsome/component/header.php,找到第54行,也就是<?php
<?php
if($this->is('index')){
$this->header(Content::exportGeneratorRules($this));
}else{
$custom_headerb = '';
if(!is_null($this->fields->description)){
$custom_headerb .= 'description=';
$custom_headerb .= $this->fields->description;
}
if(!is_null($this->fields->keywords)){
if(strcmp($custom_headerb,'') == 0){
$custom_headerb .= 'keywords=';
$custom_headerb .= $this->fields->keywords;
}else{
$custom_headerb .= '&keywords=';
$custom_headerb .= $this->fields->keywords;
}
}
if(strcmp($custom_headerb,'') == 0){
$this->header(Content::exportGeneratorRules($this));
}else{
$this->header($custom_headerb);
}
}
?>
解释
- 先判断是不是首页,如果是首页就用原方法。
- 如果不是首页,就分别判断
description
和keywords
是否填写,将他们拼起来。 - 如果
description
和keywords
都没填写依旧用原方法。 - 最后送到
header()
函数中去。