将Tags和分类联系起来 - Movable Type 插件

      使用Tagwire之后发现,如果不将Tags和分类直接联系起来,Technorati收录的很慢,如果按照Technorati的方式,用分类做Tags的话就收录的很快。为此,从新考虑使用Tags(keyword-to-tag)插件,但安装之后发现,该插件无法正确的处理中文,使用Movable Type一类带空格的标签也不方便。特别是在设置中文Tags时,插件不自动将全中文的Tags创建为分类这一点是致命的。但考虑到原来的Tagwire使用的很好,目前只需要一个能够将自己设定的Tags都创建为分类的插件,没有什么比这个插件更合适的了,所以最终决定改一下代码。

1、编辑Tags插件的“tags.pl”文件,将tag_split子程序中while ($str =~ m/("[^"]+"|'[^']+'|[^ ;,]+)/g)匹配分割符号的正则式中最后一个方括号中的空格删除掉,让插件不将空格作为多个标签的分割符合。

2、将tag_split子程序中next if $tag =~ m/^\W+$/;一行注译掉,使插件不在发现标签不是由数字、26个英文字母或者下划线组成的字符串时跳过,以便能够支持我们需要的中文标签。

修改前


sub tag_split {
    my ($str) = @_;
    $str =~ s/(^\s+|\s+$)//gs;
    my @tags;
     while ($str =~ m/("[^"]+"|'[^']+'|[^ ;,]+)/g) {
        my $tag = $1;
        next if $tag =~ m/^\W+$/;
        $tag =~ s/[ ;,]+$//;
        $tag =~ s/^"(.+?)"$/$1/;
        $tag =~ s/^'(.+?)'$/$1/;
        push @tags, $tag if $tag ne '';
    }
    @tags;
}

修改后

sub tag_split {
    my ($str) = @_;
    $str =~ s/(^\s+|\s+$)//gs;
    my @tags;
    while ($str =~ m/("[^"]+"|'[^']+'|[^;,]+)/g) {
         my $tag = $1;
#       next if $tag =~ m/^\W+$/;
        $tag =~ s/[ ;,]+$//;
        $tag =~ s/^"(.+?)"$/$1/;
        $tag =~ s/^'(.+?)'$/$1/;
        push @tags, $tag if $tag ne '';
    }
    @tags;
}

      改好之后,将“Tags.pl”上传到“plugins”目录下,在Movable Type插件设置中启动它,接下来就可以开始编辑文章,为文章添加Tags了。Tags添加的方法很简单,只需要在编辑文章中的“关键字”(标签)处输入就可以了,插件将自动将当中还没有建为分类的标签自动创建为分类,注意“关键字”输入框默认不在创建新文章的页面上打开,你可以先单击创建新文章页面各编辑输入框下方的“自定义显示此页”打开它,方便以后编辑文章时加上标签。

      不过真正用起来后还有一些问题是需要解决的,首先分类太多太乱是一个问题,因而,我在分类中建一个名称为“Tags”的分类,这样当插件自动将我们设置的标签转为分类时,将把它们都建为该分类的子分类。但是这样做,仍然无法改变在首页上显示过多分类的问题,所以决定再添一个过滤分类插件,最终选择了比较决定的FilterCategories,该插件只有一个文件,上传到“plugins”目录下就可以了。上传后首先 修改主索引模板(Index.html),利用FilterCategories我设置了在生成分类链接时只保留几个主要的分类。

修改前

<MTTopLevelCategories>
 <MTSubCatIsFirst><ul class="module-list"></MTSubCatIsFirst>
  <MTIfNonZero tag="MTCategoryCount">
   <li class="module-list-item">
   <a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>">
   <MTCategoryLabel></a>
   <MTElse>
  <li class="module-list-item"><MTCategoryLabel>
 </MTElse>
 </MTIfNonZero>
 <MTSubCatsRecurse>
 </li>
 <MTSubCatIsLast></ul></MTSubCatIsLast>
 </MTTopLevelCategories>

修改后

<MTCategories show_empty="1">
 <MTFilterCategories include="道听途说|站点制作|网络体验|软件精解|硬件前沿|电脑医院">
  <ul class="module-list"><li class="module-list-item">
  <a href="<$MTCategoryArchiveLink$>">
  <$MTCategoryLabel$></a></li></ul>
  <$MTCategoryDescription$>
 </MTFilterCategories>
</MTCategories>

      最后,既然为了Technorati收录加快,必须考虑是否修改Atom和RSS 2.0模板,使每个文章能够显示多个分类。当然,由于文章中显示分类信息是一个一个分类名称显示的,同样的需要过滤掉Tags分类,否则每个标签都是它的子分类,每次Tags都出现一次可不好。下面是atom.xml 模板和RSS 2.0 的模板修改方法。

atom.xml修改前

<MTEntryCategories>
        <category term="<$MTCategoryLabel encode_xml="1"$>" />
</MTEntryCategories>

atom.xml修改后

<MTEntryCategories>
 <MTParentCategories>
  <MTFilterCategories exclude="Tags">
   <category term="<$MTCategoryLabel encode_xml="1"$>" />
  </MTFilterCategories>
 </MTParentCategories>
</MTEntryCategories>

index.xml修改前

<category>
<$MTEntryCategory remove_html="1" encode_xml="1"$>
</category>

index.xml修改后

<MTEntryCategories>
 <category>
  <MTParentCategories>
   <MTFilterCategories exclude="Tags">
    <MTCategoryLabel encode_xml="1">
   </MTFilterCategories>
  </MTParentCategories>
 </category>
</MTEntryCategories>

另外,对于还有RSS 1.0模板的用户,可以按以下方式修改

RSS 1.0 index.rdf模板修改前

<dc:subject><$MTEntryCategory encode_xml="1"$></dc:subject>

RSS 1.0 index.rdf模板修改后

<MTEntryCategories>
 <dc:subject>
  <MTParentCategories>
   <MTFilterCategories exclude="Tags">
    <MTCategoryLabel encode_xml="1">
   </MTFilterCategories>
  </MTParentCategories>
 </dc:subject>
</MTEntryCategories>

Google

.

发表评论

(如果您从未在这里发表过评论, 您的评论必须在网站管理员验证后才可以显示, 谢谢您的耐心等候.)


引用通告

拥有Blog的朋友引用时可以使用以下链接发送引用通告(TrackBack):
http://gztw.com/lancms/mt-tb.cgi/33

链接

推荐阅读

关于种玉堂

种玉堂站内文章为作者原创,而本站新闻资讯则大多是道听途说。设立本站仅为了让文章在网上有个安身之所,同时也希望能够与更多的朋友分享。

有关站内的大小事务,如有需要可以发电子邮件至GZTW@GZTW.COM联系。