Typecho自动删除冗余、空白字段
前面都是废话,正文在下面
最近在自学Typecho的插件系统,然而官方的插件文档不仅简陋,甚至还有不少的错误和暗坑。就比如官方文档关于
Widget_Abstract_Contents->contentEx
接口的参数说明为 ($text, $contents)
,可实际上该handle的接口参数为 ($content, $widget, $lastResult)
……参数
$content
为原始文档内容,参数$lastResult
为其他插件所修改过后的内容(有可能为空),而这个$lastResult
是通过 var/Typecho/Plugin.php
的__call
魔术方法实现的!所以在无准确文档的支援之下给Typecho写插件,除了参考其他插件的作者之外,也只能自己摸着石头过河了。
瞎读了一通源码之后,作为一个PHP初学者,我感觉PHP的各种“魔术”方法简直看得头疼。
好在PHP官方的文档支持还算丰富,可以很容易查到各种函数、关键词的意义和用法。
经过不断地尝试,我总算是学会了如何调试与查询各种“魔术接口”,明白了Typecho插件的工作方式。
小试牛刀之后,我发现Typecho的插件钩子似乎并没有对自定义字段有过多支持,仅有一个
Widget_Abstract_Contents->isFieldReadOnly
可以用来过滤某些只读字段。然而若是你通过模板在文章编辑器内插入了某些自定义字段,即便没有输入数值,这些字段也会被更新到数据库中,造成冗余和空白数据。
硬着头皮又翻阅了一些Typecho处理自定义字段的代码,我发现Typecho的自定义字段虽然拥有
str_value
、int_value
、float_value
三种类别,但是其默认只会将自定义字段保存为string类型。梳理了一下流程,我通过修改
var/Widget/Abstract/Contents.php
内的源码,终于解决了这个问题。详细教程方法如下:
1. 打开var/Widget/Abstract/Contents.php
;2. 找到
public function applyFields(array $fields, $cid)
这个方法,搜寻 $this->setField($name, $type, $value, $cid);
这行代码;3. 在
$this->setField
这行代码的上方添加代码:// hack
if(empty($value)){
$this->db->query($this->db->delete('table.fields')
->where('cid = ? AND name = ?', $cid, $name));
continue;
}
4. 保存文件即可。今后在你发表、更新文章之时,当程序检测到当前字段为空白或者
'0'
时,就会自动尝试从数据库中删除相关字段,并且跳过这一次的保存动作。虽然上面的代码可以帮助你在更新文章时删除冗余字段,但已经保存在数据库中的字段,还需要你再去 phpmyadmin 中手动删除。
下面的SQL代码可以帮助你自动完成这项工作:
DELETE FROM typecho_fields WHERE str_value = '' OR str_value = '0';
(PS:记得事先备份数据库,并且更换typecho_fields
为你正确的Typecho字段表)本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
已有 1 条评论