作为一位资深的网站运营专家,我深知结构化数据在当今搜索引擎优化中的重要性。合理利用结构化数据,不仅能让搜索引擎更好地理解你的内容,还有助于在搜索结果中获得更丰富的展示机会。安企CMS(AnQiCMS)作为一个功能强大且灵活的内容管理系统,在这方面提供了出色的支持。今天,我们就来深入探讨如何利用AnQiCMS的archiveParams标签获取自定义字段,并巧妙地将其融入到Json-LD结构化数据中。

为什么自定义字段和Json-LD结合如此重要?

在安企CMS中,你可以为文章、产品等内容模型(Archive)添加丰富的自定义字段,以满足不同业务场景的个性化需求。例如,为产品添加“SKU”、“品牌”、“库存量”等字段,或为文章添加“作者简介”、“预计阅读时间”等。这些自定义字段包含了网站内容的核心信息,但默认情况下,搜索引擎可能无法直接理解这些非标准化的数据。

此时,Json-LD(JavaScript Object Notation for Linked Data)就派上了用场。它是一种基于JSON的数据格式,可以清晰地向搜索引擎描述网页上的实体及其属性。通过将安企CMS中的自定义字段映射到Json-LD的特定属性中,我们就能为搜索引擎提供更精确、更丰富的结构化信息,从而有效提升网站内容的SEO表现,甚至在搜索结果中获得富文本摘要(Rich Snippets)的机会。

了解安企CMS的自定义字段与archiveParams标签

在安企CMS的后台,你可以通过“内容管理”中的“内容模型”功能,为不同的文档类型(如文章模型、产品模型)灵活地创建自定义字段。这些字段可以是单行文本、数字、多行文本,甚至是单选、多选或下拉选择等多种形式,极大地增强了内容的表达能力。

而要将这些宝贵的自定义字段展示在前端模板中,archiveParams标签便是你的得力助手。这个标签专门用于获取当前文档(或指定文档)所关联的所有自定义参数。它的基本用法是:

{% archiveParams params with id="[文档ID]" sorted="true/false" %}
    {# 循环或直接访问自定义字段 #}
{% endarchiveParams %}

这里有两个关键参数值得注意:

  • id:如果你想获取当前页面文档的自定义字段,可以省略此参数;若要获取特定文档的字段,则需指定其ID。
  • sorted:这个参数决定了你获取到的自定义字段的组织形式。
    • sorted设置为true(默认值)时,params会是一个按后台排序顺序排列的数组对象。你需要通过{% for item in params %}循环遍历,并通过item.Name获取字段名称,item.Value获取字段值。
    • sorted设置为false时,params会是一个无序的Map对象,其键名直接对应你在后台设置的“调用字段”。这种方式更适合你知道要获取哪个具体字段的场景,你可以直接通过params.你的调用字段名.Value来访问。例如,如果你有一个名为product_sku的调用字段,可以直接用{{ params.product_sku.Value }}来获取其值。对于我们需要精确映射到Json-LD的场景,sorted=false通常更为便捷。

将自定义字段融入Json-LD的实践步骤

现在,我们以一个具体场景为例:假设我们有一个“产品模型”,其中定义了两个自定义字段,它们的“调用字段”分别是product_sku(单行文本)和brand_name(单行文本)。我们希望将这两个字段的值添加到产品的Json-LD结构化数据中。

第一步:在安企CMS后台定义自定义字段

首先,请确保你已经在安企CMS后台的“内容管理”->“内容模型”中,选择了或创建了你的“产品模型”,并为其添加了名为product_skubrand_name的自定义字段(确保“调用字段”名称准确无误)。然后,在发布产品时,为这些字段填入相应的值。

第二步:在模板中获取自定义字段

通常,你会在产品的详情页(例如product/detail.html)进行操作。首先,我们需要使用archiveParams标签以Map的形式获取这些自定义字段。

{# 在产品详情页的适当位置(例如顶部)获取自定义字段 #}
{% archiveParams productCustomFields with sorted=false %}
    {# 现在 productCustomFields 是一个Map,我们可以直接通过键名访问 #}
    {% set sku = productCustomFields.product_sku.Value %}
    {% set brand = productCustomFields.brand_name.Value %}
{% endarchiveParams %}

{# 你也可以在这里输出这些变量进行调试,例如:#}
{# <p>SKU: {{ sku }}</p> #}
{# <p>Brand: {{ brand }}</p> #}

这里,我们通过with sorted=false将自定义字段作为Map获取,然后使用{% set %}标签将product_skubrand_name的值分别赋值给skubrand这两个新的模板变量。这样做的好处是,变量名更简洁,方便后续在Json-LD中使用。

第三步:使用jsonLd标签将自定义字段嵌入Json-LD

安企CMS提供了jsonLd标签来管理页面的Json-LD数据。这个标签的强大之处在于,它允许你覆盖或补充系统默认生成的Json-LD数据。你只需要在其内部编写符合Json-LD语法规范的JSON代码,系统便会自动将其与默认数据进行合并。

现在,我们来将skubrand变量插入到Json-LD中。我们假设我们要为产品添加一个Product类型的Schema。

{% jsonLd %}
<script type="application/ld+json">
{
    "@context": "https://schema.org/",
    "@type": "Product",
    "name": "{% archiveDetail with name='Title' %}", {# 获取产品标题 #}
    "sku": "{{ sku }}", {# 插入自定义的SKU #}
    "brand": {
        "@type": "Brand",
        "name": "{{ brand }}" {# 插入自定义的品牌名称 #}
    },
    "description": "{% archiveDetail with name='Description' %}", {# 获取产品简介 #}
    "image": "{% archiveDetail with name='Logo' %}", {# 获取产品主图 #}
    "offers": {
        "@type": "Offer",
        "url": "{% archiveDetail with name='Link' %}",
        "priceCurrency": "USD", {# 假设币种是美元 #}
        "price": "{% archiveDetail with name='Price' %}", {# 假设产品价格存储在内置Price字段 #}
        "availability": "https://schema.org/InStock"
    }
}
</script>
{% endjsonLd %}

在这个例子中:

  • 我们首先使用{% archiveDetail %}标签获取了产品的内置字段,如TitleDescriptionLogoLink,这些是构建产品Json-LD的基础信息。
  • 然后,我们巧妙地将第二步中获得的skubrand变量,通过{{ sku }}{{ brand }}的形式,嵌入到了"sku""brand"对应的位置。
  • 请注意Json-LD的语法,brand是一个对象,因此我们需要为其指定@typename属性。
  • price字段我们也假设使用了安企CMS内置的Price字段。

通过以上步骤,当你的产品详情页被访问时,页面源代码中就会生成包含这些自定义字段的、丰富而精确的Json-LD结构化数据。这将极大地帮助搜索引擎理解你的产品信息,从而在搜索结果中提供更具吸引力的展示。

**实践与温馨提示

  1. 验证是关键:完成Json-LD代码的编写后,务必使用Google的Rich Results Test(富文本结果测试工具)或Schema.org的Schema Markup Validator进行验证。这能帮助你检查语法错误,并确保数据结构符合规范。
  2. 处理空值:你的自定义字段可能并非总是被填写。在Json-LD中直接插入空值可能会导致结构化数据错误。建议在使用前进行判断,例如使用{% if sku %}或为变量设置默认值{% set sku = productCustomFields.product_sku.Value|default:'' %}来避免输出空字符串。
  3. 了解Schema类型:Schema.org定义了大量的Schema类型(如ProductArticleOrganization等)。选择最符合你内容类型的Schema,并根据其属性规范来映射你的自定义字段。
  4. 放置位置jsonLd标签通常放置在HTML的<head><body>标签内部,具体位置不影响搜索引擎解析,但建议统一放置以便于管理。

通过掌握archiveParamsjsonLd这两个强大标签的组合使用,你将能够充分释放安企CMS的潜力,为网站的SEO表现注入新的活力。


常见问题 (FAQ)

Q1:为什么我添加了archiveParamsjsonLd标签,但Json-LD中没有显示自定义字段?

A1: 这可能是由几个原因造成的。首先,请检查自定义字段的“调用字段”名称是否与你在archiveParamssorted=false模式下访问的键名完全一致,包括大小写。其次,确保在后台发布文档时,这些自定义字段确实被填写了内容,如果为空,{{ variable }}可能不会输出任何东西。最后,检查Json-LD的JSON语法是否正确,一个微小的逗号或引号错误都可能导致整个Json-LD块解析失败。建议使用Google的Rich Results Test工具进行实时验证,它会指出具体的错误位置。

Q2:archiveParams能否获取除当前文档外的其他文档的自定义字段?

A2: 可以的。archiveParams标签支持id参数。你可以在任何页面通过id="[文档ID]"来指定获取任意文档的自定义字段。例如,{% archiveParams relatedProductFields with id="123" sorted=false %}可以获取ID为123的文档的自定义字段。这在你需要聚合相关信息或构建复杂页面布局时非常有用。

Q3:如果我有很多自定义字段,并且想动态地将其中一部分包含到Json-LD中,有没有更灵活的方法?

A3: 当然有。你可以结合archiveParamssorted=true模式和模板的for循环以及if判断来实现。首先,以数组形式获取所有自定义字段:{% archiveParams allCustomFields %}。然后,在Json-LD的JSON结构中,你可以用模板逻辑动态构建一部分JSON内容:

<script type="application/ld+json">
{
    "@context": "https://schema.org/",
    "@type": "Product",
    "name": "{% archiveDetail with name='Title' %}",
    {% for field in allCustomFields %}
        {% if field.Name == "产品SKU" %}
            "sku": "{{ field.Value }}",
        {% elif field.Name == "品牌名称" %}
            "brand": { "@type": "Brand", "name": "{{ field.Value }}" },
        {% endif %}
    {% endfor %}
    "description": "{% archiveDetail with name='Description' %}"
    {# ... 其他字段 ... #}
}
</script>

这种方法允许你根据field.Name(自定义字段的显示名称)或field.FieldName(调用字段名,如果sorted=false则更方便)来判断是否包含某个字段,并灵活地构建Json-LD,尤其适用于有条件显示或字段名多变的情况。不过,要注意生成的JSON格式必须严格正确,避免多余的逗号等问题。