【问题标题】:How to use multiple elements in JSON-LD [closed]如何在 JSON-LD 中使用多个元素 [关闭]
【发布时间】:2018-08-14 19:00:38
【问题描述】:

我有一个描述旅游景点的页面 (TouristAttraction)。由于我还想添加面包屑信息,所以我还需要添加WebPage

添加两个信息的方法是什么:

  1. 我应该使用WebPage并将TouristAttraction添加为mainEntity吗?
  2. 我应该创建 2 个单独的 JSON-LD script 块吗? WebPageTouristAttraction 块?

当使用 2 个实体时:

  1. 我必须提供两个实体的主要信息(名称、图像、评级等),还是只提供一个实体(哪一个)?

【问题讨论】:

    标签: schema.org json-ld


    【解决方案1】:

    @unor 的回答几乎是正确的,但如果你是为 google serp 做的,那么只有将它分成单独的 json 块(或图形符号)才能得到最好的结果。

    假设您想使用 Recipe 实体在 serps 中获取 google's rich snippet for Recipies,您可以这样做:

    <script type="application/ld+json">
    {
      "@context":"https:\/\/schema.org",
      "@type":"Recipe",
      "name":"Example",
      "image":"https:\/\/www.example.com"
    }
    </script>
    

    在 google 的 Structed Data Testing Tool 中,您将获得一个预览按钮:

    如果您现在想要添加来自其他实体的其他信息(如面包屑),则必须使用单独的 JSON-LD 块,否则您将无法获得预览按钮。比如

    <script type="application/ld+json">
    {
        "@context": "http://schema.org",
        "@type": "ItemPage",
        "breadcrumb": {
            "@type": "BreadcrumbList"
        },
        "mainEntity": {
            "@type":"Recipe",
            "name":"Example",
            "image":"https:\/\/www.example.com"
        }
    }
    </script>
    

    有效,但不会显示预览按钮。

    但如果你把它分开,它会显示到单独的实体和预览按钮:

    <script type="application/ld+json">
        {
            "@context": "http://schema.org",
            "@type": "ItemPage",
            "breadcrumb": {
                "@type": "BreadcrumbList"
            }
        }
    </script>
    <script type="application/ld+json">
    {
        "@context": "http://schema.org",
            "@type":"Recipe",
            "name":"Example",
            "image":"https:\/\/www.example.com"
        }
    }
    </script>
    

    同样适用于 Array-Notation:

    <script type="application/ld+json">
    [
        {
            "@context": "http://schema.org",
            "@type": "ItemPage",
            "breadcrumb": {
                "@type": "BreadcrumbList"
            }
        },
        {
            "@context": "http://schema.org",
             "@type":"Recipe",
             "name":"Example",
             "image":"https:\/\/www.example.com"
        }
    ]
    </script>
    

    还有图表:

    <script type="application/ld+json">
    {
      "@context": "http://schema.org",
      "@graph": 
        [
            {
                "@type": "ItemPage",
                "breadcrumb": {
                    "@type": "BreadcrumbList"
                }
            },
            {
                "@type":"Recipe",
                "name":"Example",
                "image":"https:\/\/www.example.com"
            }
        ]
    }
    </script>
    

    学分归@unor(另见How do you combine several JSON-LD markups?

    【讨论】:

    • 我有三个问题/备注: 1.如果您在工具中没有获得预览按钮,这是否意味着您在实际搜索结果中也不会获得丰富的sn-p? 2. 另外,如果您将mainEntity 添加到WebPage。 (例如Blogposting)该工具仍然要求您将MainEntityOfPage 添加到BlogPosting。这对我来说似乎有点奇怪。 3. 如果添加多个顶级实体。您不是让 Google 决定将哪个作为该页面的主要实体吗?因此,即使您不会在工具中获得预览按钮,明确指出主要实体不是更好吗?
    • 我不知道,如果没有显示预览按钮,Google 是否会按预期使用数据。这就是为什么我建议使用其他变体(数组、图形等)。
    【解决方案2】:

    使用mainEntity 当然比不使用它更好,因为更多的数据(如果准确的话)通常比更少的数据更好。

    但是在这两种情况下你都可以使用mainEntity,不管你是使用一个还是多个script元素。在第一种情况下,您可以简单地嵌套项目。第二种情况,可以make use of URI references

    <script type="application/ld+json">
    {
      "@context": "http://schema.org",
      "@type": "ItemPage",
      "breadcrumb": {
        "@type": "BreadcrumbList"
      },
      "mainEntity": {
        "@type": "TouristAttraction"
      }
    }
    </script>
    
    <script type="application/ld+json">
    {
      "@context": "http://schema.org",
      "@type": "ItemPage",
      "breadcrumb": {
        "@type": "BreadcrumbList"
      },
      "mainEntity": {"@id": "#content"}
    }
    </script>
    
    <script type="application/ld+json">
    {
      "@context": "http://schema.org",
      "@type": "TouristAttraction",
      "@id": "#content"
    }
    </script>
    

    (还有there are other ways。)

    当然,无论您选择哪种方式,ItemPageTouristAttraction 都是不同的实体。因此,如果您将aggregateRating 添加到ItemPage,则用于页面评分,如果将​​其添加到TouristAttraction,则将其用于景点评分。对于具有相同值的属性,将它们添加到两个实体中仍然有意义,因为消费者可能只对其中一个实体感兴趣而忽略另一个。

    【讨论】:

    • 请根据您的答案查看我自己的答案,因为您的答案可能不完全正确?
    • @bernhardh:感谢您的注意 :) 我的回答显示应该正确使用 Schema.org 和 JSON-LD。结构化数据的消费者(如 Google 搜索)可能会在此基础上添加任何限制,甚至可能产生冲突(如果一个消费者想要这样,而另一个消费者想要这样)。由于您的问题没有针对特定消费者,因此我不想针对特定消费者做出回答。 -- 也就是说,我不能确定谷歌 SDTT 上缺少的“预览”按钮是否足以表明谷歌搜索不会显示丰富的结果——需要实时测试。
    • 非常感谢。我完全同意,一般来说,所有解决方案都是正确的,但在我的情况下,我只添加架构数据以获得更好的 google serp 放置和点击率(可能像大多数用户一样)。
    【解决方案3】:

    WebPage 对于网页是隐式的,所以你不需要专门添加它。

    您可以将 BreadcrumbList 定义为顶级实体,系统将理解它是网页内的实体。

    对于您希望被视为主要实体的实体,您还可以将其设为顶级实体,并使用 mainEntityOfPage 将其 id 设置为页面的 URL 来声明它是主要实体。

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多