【JSON-LD】SEO対策｜Googleクローラ用にページを構造化マークアップする方法（リッチリザルト対応）

SEO対策として重要な構造化マークアップ（リッチリザルト）を実装する方法と実例について。


##目次

1. [構造化マークアップやリッチリザルトとは何か？](#構造化マークアップやリッチリザルトとは何か)
2. [構造化マークアップの注意点](#構造化マークアップの注意点)
2. [記述方法](#記述方法)
3. [website（サイト内検索ボックスの表示）](#websiteサイト内検索ボックスの表示)
4. [BreadcrumbList（パンくず）](#breadcrumblistパンくず)
5. [Article（記事）](#article記事)
6. [デバッグ（テストページリンク）](#デバッグテストページリンク)
7. [schema.orgとは何か？](#schemaorgとは何か)




<br>
##構造化マークアップやリッチリザルトとは何か？
Googleでの検索結果をリッチ（強化）する機能。ページに適切なコードを追記することで対応できる。

**▼こういうの**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/3feb947a-327f-b7db-a88c-e0f843e5b829.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/fb5c7afd-2147-bddd-d506-955532612d41.png)

検索結果がリッチになるので、リッチリザルトと呼ばれる。

このリッチリザルトのためのマークアップを構造化マークアップと呼ぶ。


<br>
##構造化マークアップの注意点
記述にミスがあると、scriptタグ内の情報がムシされる。

ページの種類により実装できる構造化のタイプが変わってくる。

Googleにガイドラインがあり反することをするとペナルティがかけられるリスクがある。（SEO目的のキーワードの埋め込みとか）

ちゃんとガイドラインに沿って実装すれば問題ない。

Googleサーチコンソールで実装状況やエラー状況の確認ができる。



##記述方法
コードの記述方法はJSON-LDやRDFa, microdataなど複数存在する。

可読性やメンテ性を考慮するとJSON-LDがおすすめ。


```json:
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "構造化の種類",
    構造化の詳細
    }
}
</script>
```


<br>
###構造化マークアップの例

##website（サイト内検索ボックスの表示）
検索結果に検索ボックスが出るかどうかはGoogle次第。

**▼WEBサイトのみ**

```json:
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Website",
    "name": "サイトの名前",
    "url": "サイトのURL",
    "potentialAction": {
       "@type": "SearchAction",
       "target": "検索ページのURL?q={search_term_string}",
       "query-input": "required name=search_term_string"
    }
}
</script>
```

<br>
**▼androidアプリ**
以下を追記する。

```json:
,{
        "@type": "SearchAction",
        "target": "android-app://com.example/https/query.example.com/search/?q={search_term_string}",
        "query-input": "required name=search_term_string"
      }
```


https://developers.google.com/search/docs/data-types/sitelinks-searchbox?hl=ja

https://schema.org/WebSite


検索ボックスの構造化マークアップをしない場合は不要。

`"@type": "Website"`でpotentialActionを記述しない場合は、googleは構造化マークアップとは見なさないため。

なお、この構造化を組んでいないページでも検索結果に検索ボックスが表示されることが多々ある。（企業トップページで多い）



<br>
##BreadcrumbList（パンくず）
パンくずが以下の場合の例、

・`パンくず１ > パンくず２ > パンくず3`


```json:
<script type="application/ld+json">
  {
      "@type": "BreadcrumbList",
      "@context": "https://schema.org",
      "itemListElement": [
          {
              "@type": "ListItem",
              "position": 1,
              "name": "パンくず名１",
              "item": "ページのURL"
          },
          {
              "@type": "ListItem",
              "position": 2,
              "name": "パンくず名２",
              "item": "ページのURL"
          },
          {
              "@type": "ListItem",
              "position": 3,
              "name": "パンくず名３"
          }
      ]
  }
</script>
```

パンくずの数に合わせて増やしたり減らしたりする。最終ページはURLを付けない。

https://developers.google.com/search/docs/data-types/breadcrumb?hl=ja



<br>
##Article（記事）
記事ページにつける。

```json:
<script type="application/ld+json">
    {
        "@type": "Article",
        "@context": "http://schema.org",
        "mainEntityOfPage": {
			"@type": "WebPage",
			"@id": "ページのURL"
		},
		"headline": "記事タイトル",
		"image": "キービジュアル画像（配列にして複数記述してもいい）",
		"datePublished": "投稿日 YYYY-MM-DD HH:MM:SS",
		"dateModified": "更新日 YYYY-MM-DD HH:MM:SS",
		"author": {
			"@type": "Person",
			"name": "執筆者名"
		},
		"publisher": {
			"@type": "Organization",
			"name": "組織名",
			"logo": {
				"@type": "ImageObject",
				"url": "組織ロゴのURL"
			}
		}
	}
</script>
```



<br>
##複数設置する例
**配列を用意しの中に、`,`で区切って記述**していく。

例えば、記事ページに以下の３つ（Website + BreadcrumbList + Article）のjson-ldを実装する場合。

```json:
<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Website",
    "name": "サイトの名前",
    "url": "サイトのURL",
    "potentialAction": {
       "@type": "SearchAction",
       "target": "検索ページのURL?q={search_term_string}",
       "query-input": "required name=search_term_string"
    }
  },
  {
    "@type": "BreadcrumbList",
    "@context": "https://schema.org",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 1,
            "name": "パンくず名１",
            "item": "ページのURL"
        },
        {
            "@type": "ListItem",
            "position": 2,
            "name": "パンくず名２",
            "item": "ページのURL"
        },
        {
            "@type": "ListItem",
            "position": 3,
            "name": "パンくず名３",
        }
    ]
  },
  {
    "@type": "Article",
    "@context": "http://schema.org",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "ページのURL"
    },
    "headline": "記事タイトル",
    "image": "キービジュアル画像（配列にして複数記述してもいい）",
    "datePublished": "投稿日 YYYY-MM-DD HH:MM:SS",
    "dateModified": "更新日 YYYY-MM-DD HH:MM:SS",
    "author": {
      "@type": "Person",
      "name": "執筆者名"
    },
    "publisher": {
      "@type": "Organization",
      "name": "組織名",
      "logo": {
        "@type": "ImageObject",
        "url": "組織ロゴのURL"
      }
    }
  }
]
</script>
```


##デバッグ（テストページリンク）
完成したら、[テストページ](https://search.google.com/test/rich-results?utm_campaign=devsite&utm_medium=rdfa&utm_source=breadcrumb)で正しく読み込めれるか確認。

サイトのURLが`http(s)://`になっていないので警告が出ている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/1cf663df-db92-0747-3a19-a0bacecb50a2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8e337e9d-5db9-5d47-7c50-736e45b54062.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e87c50ec-c362-ee0b-d53c-ed55ecc58b08.png)

URLを正規のもの（または https://example.com ）などにすればエラーは消える。


<br>
##schema.orgとは何か？
構造化マークアップの仕様は https://schema.org で定義されている。

用意されているプロパティはかなりたくさんあり、かつ、プロパティの中に入れ子でプロパティを記述できたりと結構複雑。。

また、Googleがどこまでサポートして読み込んでくれるのかが曖昧名ため、基本的にはGoogleのガイドラインに準拠していれば、schema.orgは参照しなくても問題ない。

▼Articleの例

https://schema.org/Article

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2ef13e71-bdec-0dfa-f0fc-9e5a65d180e7.png)
省略