使用Movable Type也有挺长一段时间,从版本2.X用到现在的4.X,这过程中也用过了一些插件,比如MultiBlogPaginationmt-relatedentries等等。现在要讲的就是其中的mt-relatedentries—-相关文章的插件。

不知道从哪一次开始,就因为mt-relatedentries的问题导致数篇文章无法重建,每次在重建到这几篇文章的时候都会中断,于是我就想办法找一些替代的方案,因此我就找到了《Related Entries in Movable Type》。

首先,创建一个名为”Related”(可自己命名)的模板模块,内容为:

<mt:entryiftagged>
<mt:setvarblock name="curentry"><mt:entryid /></mt:setvarblock>
<mt:setvarblock name="sgtags"><mt:entrytags glue=" OR "><mt:tagname></mt:entrytags></mt:setvarblock>
<mt:setvarblock name="listitems"><mt:entries tags="$sgtags"><mt:setvarblock name="listentry"><mt:entryid /></mt:setvarblock><mt:unless name="listentry" eq="$curentry"><li><a href="<mt:entrypermalink />"><mt:entrytitle /></a></li></mt:unless></mt:entries></mt:setvarblock>
<mt:if name="listitems">
<h3>Related Entries</h3>
<ul>
<mt:var name="listitems">
</ul>
</mt:if>
</mt:entryiftagged>

当您填写以上代码时要注意,<mt:setvarblock></mt:setvarblock>之间不能有换行。理论上是可以使用strip_linefeeds属性也不必担心换行的问题,但是我就是碰到了问题。事实上是发现了非常陌生的Bug。我们只是将这些换行去除,而不是去处理这些Bug。

现在将这个模板模块保存,切换到文章明细页的模板。在相应的地方加入以下代码(如果您使用的是默认模板,那放在<$MTInclude module=”Entry Detail”$>之后就行了):

<$MTInclude module="Related"$>

重建您的Blog,您将在每个文章明细看到一个相关文章的列表。让我们进一步看一下我们刚才加入的代码,看发生了什么。

<mt:entryiftagged>

只有拥有Tag(标签)的文章,这段代码才起作用。

<mt:setvarblock name="curentry"><mt:entryid /></mt:setvarblock>

储存该文章的ID,后面会用到。

<mt:setvarblock name="relatedtags"><mt:entrytags glue=" OR "><mt:tagname></mt:entrytags></mt:setvarblock>

在这里,我们使用<mt:entrytags>输出这篇文章所包含的Tag列表。glue属性指定不同Tag之间的连接字符。因此,如果一篇文章拥有以下的Tag,”cats, pet food, dogs”,那么我们将得到:

cats OR pet food OR dogs

这部分内容将被储存在一个变量中,后面会用到。

<mt:setvarblock name="listitems"><mt:entries tags="$relatedtags"><mt:setvarblock name="listentry"><mt:entryid /></mt:setvarblock><mt:unless name="listentry" eq="$curentry"><li><a href="<mt:entrypermalink />"><mt:entrytitle /></a></li></mt:unless></mt:entries></mt:setvarblock>

我们使用了一个带有Tags筛选的<mt:entries>。这将选出拥有与这篇文章相同Tag的文章(只要有一个Tag相同即可)。在选出这些文章的时候,我们将它们的ID储存在一个变量中。接下来,我们用<mt:unless>加上条件来与之前储存的变量作比较,这将让我们从创建的文章列表中过滤掉本文。

接下来就把这个列表显示出来:

<mt:if name="listitems">
<h3>Related Entries</h3>
<ul>
<mt:var name="listitems">
</ul>
</mt:if>
</mt:entryiftagged>

现在,就不需要更好的显示”相关文章”的方法了。这种方法无法判别哪一篇的文章相关度更高,我们只是将有相关Tag的文章显示出来。而且如果您使用的是静态发布而非动态发布的时候,旧的文章无法显示出更新的相关文章,除非你重建这篇文章。无论如何,这是一个简易的办法,无需任何插件,同时也是一个很好的使用Movable Type变量完成复杂事情的例子。

原文:《Related Entries in Movable Type》—-Billy Mabray
翻译:《用MT本身的Tag功能实现相关文章的显示》—-Ethan Jiang