将typecho中文标签Slug自动转换成拼音格式
预计阅读时间: 4分钟
Typecho是一个小巧的博客程序,相比wordpress,速度更快,对于功能比较单一以内容为主的博客网站来说,还是很有优势的。
但是typecho中文标签的链接形式并不是很友好,并没有将中文转换成英文或其它对浏览器友好的形式,浏览器中直接输入中文,不仅不美观,在某些情况下还无法被识别,比如在微信或QQ等聊天工具里面。当然也可以手动修改,就是很麻烦,在发布文章的时候是不能修改的,必需得在发布以后,再到标签管理页面修改。
那么有没有可能让它在发布的时候就自动转换呢?研究了一下typecho的代码,发现它本身有一个函数slugName来生成slug缩略名的,但是当tag是中文的时候,它就无法转换,生成的缩略名还是跟它的名称一样。
为了让它能自动转换,就必需用一个可以转换中文的函数替代它,将下方代码,放入/var/Typecho/Common.php文件中的Common类中。
代码片段.txt
然后打开/var/Widget/Base/Metas.php,找到$slug = Common::slugName($tag);替换成:$slug = Common::Pinyin($tag);上传保存就可以了,文章添加的中文标签就可以自动转换成拼音了,比如“中国”将会转换成zhong-guo,不过当前这个函数并不支持一些生僻字,碰到生僻字会直接跳过,所以尽量不要用生僻字做标签了。
扩展:
如果需要批量将已存在的中文标签转换成拼音,可以通过以下步骤实现:
打开/admin/manage-tags.php,找到
<li class="multiline">
在它的上方加入一行代码:
<li><a lang="<?php _e('自动转换标签可能需要等待较长时间, 你确认要自动转换这些标签吗?'); ?>" href="<?php $security->index('/action/metas-tag-edit?do=autoslug'); ?>"><?php _e('转换'); ?></a></li>
这样就增加了一个转换按钮。
再打开:/var/Widget/Metas/Tag/Edit.php,在类库里面增加一个转换函数。
public function autoSlugTag(){
$tags = $this->request->filter('int')->getArray('mid');
if ($tags) {
foreach ($tags as $tag) {
$this->updateTagSlugByMid($tag);
}
Notice::alloc()->set(_t('标签自动转换已经完成'), 'success');
} else {
Notice::alloc()->set(_t('没有选择任何标签'), 'notice');
}
/** 转向原页 */
$this->response->goBack();
}</code></pre><p>同时找到action()函数,在函数内部加入:</p><pre><code>$this->on($this->request->is('do=autoslug'))->autoSlugTag();
再打开/var/Widget/Base/Metas.php,在类库里面增加一个更新函数。
public function updateTagSlugByMid(int $mid){
$tag = $this->db->fetchRow($this->db->select()
->from('table.metas')
->where('type = ?', 'tag')
->where('mid = ?', $mid)->limit(1));
$tagname = $tag["name"];
$slug = Common::Pinyin($tagname);
if ($slug) {
$this->db->query($this->db->update('table.metas')->rows(['slug' => $slug])->where('mid = ?', $mid));
}
}
到此,就可以在后台标签管理页面批量转换标签了。