在网站运营中,文章的标签(Tag)不仅有助于内容的分类和检索,还能通过关键词的形式提升页面的SEO效果。很多时候,我们需要在页面的特定位置,比如<meta name="keywords">标签中,或者文章内容底部,将多个标签以逗号分隔的形式展现出来。安企CMS(AnQiCMS)提供了简洁而灵活的模板语法,让这一操作变得非常直接。

了解文章标签数据的来源

在安企CMS中,一篇文章的标签数据可以通过 tagList 标签获取。这个标签设计得非常灵活,当你在文章详情页使用它时,如果省略 itemId 参数,它会自动识别并获取当前文章所关联的所有标签。每个标签都会作为一个对象返回,其中包含标签的 Title(标题)、Link(链接)等信息。

如何连接标签成字符串

由于 tagList 返回的是一个标签对象列表,而不是一个简单的字符串列表,我们不能直接使用 join 过滤器将它们连接起来。最常用且有效的方法是结合 for 循环和条件判断,逐一输出标签标题并手动添加分隔符。

以下是实现这一功能的具体步骤和代码示例:

  1. 获取文章的标签列表 首先,我们需要使用 tagList 标签来获取当前文章的所有标签。在文章详情页(例如 archive/detail.html 或自定义的文档详情模板)中,可以直接调用,它会自动关联到当前展示的文章。

    {% tagList articleTags %}
        {# articleTags 将包含当前文章的所有标签对象 #}
    {% endtagList %}
    

    在这里,我们把获取到的标签列表赋值给了 articleTags 这个变量。

  2. 在循环中构建逗号分隔的字符串 接下来,我们将遍历 articleTags 列表,取出每个标签的 Title 属性,并在每个标签标题之后添加逗号和空格,但要避免在最后一个标签后添加逗号。这可以通过 forloop.last 属性来判断。

    <div class="article-tags">
        <strong>关键词:</strong>
        {% tagList articleTags %}
            {% for tag in articleTags %}
                {{ tag.Title }}
                {% if not forloop.last %}, {% endif %}
            {% endfor %}
        {% else %}
            <span>暂无标签</span>
        {% endtagList %}
    </div>
    
    • {% for tag in articleTags %}:开始遍历 articleTags 列表,将每个标签对象赋值给 tag 变量。
    • {{ tag.Title }}:输出当前标签的标题。
    • {% if not forloop.last %}, {% endif %}:这是一个关键的条件判断。forloop.last 会在当前迭代是循环中的最后一个元素时返回 true。因此,if not forloop.last 意味着“如果这不是最后一个元素”,我们就输出一个逗号和空格 ,
    • {% else %} <span>暂无标签</span> {% endtagList %}:如果文章没有任何标签,可以显示一个默认提示,提升用户体验。

完整示例代码

假设您希望在文章详情页的文章内容下方展示这些标签:

<article class="article-detail">
    <h1>{{ archive.Title }}</h1>
    <div class="article-meta">
        发布日期: {{ stampToDate(archive.CreatedTime, "2006-01-02") }} | 浏览量: {{ archive.Views }}
    </div>

    <div class="article-content">
        {{ archive.Content|safe }}
    </div>

    <div class="article-keywords">
        <strong>关键词:</strong>
        {% tagList articleTags %}
            {% for tag in articleTags %}
                <a href="{{ tag.Link }}" title="{{ tag.Title }}">{{ tag.Title }}</a>{% if not forloop.last %}, {% endif %}
            {% endfor %}
        {% else %}
            <span>暂无标签</span>
        {% endtagList %}
    </div>
</article>

在这个例子中,每个标签都被包装成一个带有链接的锚文本,点击后可以跳转到该标签的聚合页,这对于SEO和用户导航都非常有益。

将标签字符串用于 <meta name="keywords">

如果您需要将这些标签用于页面的 meta keywords,您可以使用 set 标签先将标签标题收集起来,然后再进行拼接。由于AnQiCMS的模板引擎并不直接支持在循环内动态构建列表并使用 join 过滤器,最稳妥的方法是在后端准备好这个字符串,或者在前端通过JavaScript处理(但这不是模板层面的解决方案)。

然而,考虑到现代SEO实践中,meta keywords 的权重已经非常低,甚至被多数搜索引擎忽略,更常见且推荐的做法是将标签作为可见内容展示在页面上,并确保其具有良好的可访问性和内部链接。如果坚持需要在模板中构建,可能需要考虑模板引擎更高级的特性或后台数据处理。

总结

通过 tagList 标签结合 for 循环和 forloop.last 条件判断,您可以在AnQiCMS模板中灵活地将文章的多个标签连接成一个以逗号分隔的字符串,并根据需求选择是否将其转换为可点击的链接。这种方法既能满足内容展示的需求,也为网站的SEO优化提供了基础支持。


常见问题 (FAQ)

  1. 问:我能否让输出的标签直接成为可点击的链接,而不是纯文本的逗号分隔字符串? 答:完全可以。在上面的示例代码中,我们已经展示了如何通过在 {{ tag.Title }} 外面包裹 <a> 标签,并使用 {{ tag.Link }} 作为链接地址,从而使每个标签都成为一个可点击的链接。这样不仅美观,也提升了用户体验和网站内部链接的SEO效果。

  2. 问:如果文章没有任何标签,页面会显示什么? 答:在提供的示例代码中,我们使用了 {% else %} 语句。如果 tagList 没有获取到任何标签,那么 for 循环内的内容将不会执行,而是会执行 {% else %} 后面的内容,即显示 <span>暂无标签</span>。您可以根据自己的需求修改这段提示文本或选择不显示任何内容。

  3. 问:如何在文章列表页展示每篇文章的标签,而不是只在详情页? 答:在文章列表页,您通常会使用 archiveList 标签来循环展示多篇文章。在 archiveList 的循环(for item in archives)内部,您可以再次嵌套 tagList 标签,并通过 itemId=item.Id 参数明确指定要获取当前循环文章的标签。这样,每篇文章的标签都会正确显示。例如:

    {% archiveList archives with type="page" limit="10" %}
        {% for item in archives %}
            <div class="article-item">
                <h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
                <div class="article-tags">
                    {% tagList currentArticleTags with itemId=item.Id %}
                        {% for tag in currentArticleTags %}
                            <a href="{{ tag.Link }}">{{ tag.Title }}</a>{% if not forloop.last %}, {% endif %}
                        {% endfor %}
                    {% endtagList %}
                </div>
            </div>
        {% endfor %}
    {% endarchiveList %}