预计阅读时间: 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>

这样就增加了一个转换按钮。
2.jpg

再打开:/var/Widget/Metas/Tag/Edit.php,在类库里面增加一个转换函数。

 public function autoSlugTag()

{
    $tags = $this-&gt;request-&gt;filter(&#039;int&#039;)-&gt;getArray(&#039;mid&#039;);
    if ($tags) {
        foreach ($tags as $tag) {
            $this-&gt;updateTagSlugByMid($tag);
        }

        Notice::alloc()-&gt;set(_t(&#039;标签自动转换已经完成&#039;), &#039;success&#039;);
    } else {
        Notice::alloc()-&gt;set(_t(&#039;没有选择任何标签&#039;), &#039;notice&#039;);
    }

    /** 转向原页 */
    $this-&gt;response-&gt;goBack();
}</code></pre><p>同时找到action()函数,在函数内部加入:</p><pre><code>$this-&gt;on($this-&gt;request-&gt;is(&#039;do=autoslug&#039;))-&gt;autoSlugTag();

再打开/var/Widget/Base/Metas.php,在类库里面增加一个更新函数。

public function updateTagSlugByMid(int $mid)

{
    $tag = $this-&gt;db-&gt;fetchRow($this-&gt;db-&gt;select()
        -&gt;from(&#039;table.metas&#039;)
        -&gt;where(&#039;type = ?&#039;, &#039;tag&#039;)
        -&gt;where(&#039;mid = ?&#039;, $mid)-&gt;limit(1));
    $tagname = $tag[&quot;name&quot;];
    $slug = Common::Pinyin($tagname);
    if ($slug) {
           $this-&gt;db-&gt;query($this-&gt;db-&gt;update(&#039;table.metas&#039;)-&gt;rows([&#039;slug&#039; =&gt; $slug])-&gt;where(&#039;mid = ?&#039;, $mid));
    }
}

到此,就可以在后台标签管理页面批量转换标签了。

标签: none

添加新评论

*所有评论审核后方可显示,请自觉维护清朗的互联网环境,不要发布违法违规及攻击他人言论。