sitemap.xml（XMLサイトマップ）の作り方

# はじめに

SEOで必要となるsitemap.xml（XMLサイトマップ）。
巷では無料の生成ツールを使って作る方法が多く紹介されていますが、noindexも拾ってしまったり、canonicalを指定しているURLも拾ってしまったりします。階層が深いと全部を拾ってくれないこともあります。

でも、sitemap.xml（XMLサイトマップ）はそれほど難しくないので、基本を覚えて動的に生成できるプログラムを自作で作った方が確実です。

# 基本フォーマット

Googleが推奨するsitemap.xml（XMLサイトマップ）の基本的なフォーマットは以下です。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://www.example.com/</loc>
        <lastmod>2005-01-01</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.8</priority>
    </url>
</urlset>
```

## 必須のタグ

<dl>
  <dt>&lt;?xml?&gt;</dt>
  <dd>XML宣言、文字コード指定。最初に１行だけ記述する。</dd>
  <dt>&lt;urlset&gt;</dt>
  <dd>XML文書がどのXML Schemaに沿って記述されているかを記述。全体を囲むタグ。１ファイル１つでよい。</dd>
  <dt>&lt;url&gt;</dt>
  <dd>各URLエントリの親タグ。URLの数だけ用意する。</dd>
  <dt>&lt;loc&gt;</dt>
  <dd>ページのURLを記述。重複していない固有のURLを記載すること。2,048 文字以下で指定する必要がある。</dd>
</dl>

## オプションのタグ

<dl>
  <dt>&lt;lastmod&gt;</dt>
  <dd>ファイルの最終更新日。W3C Datetime 形式で記述する必要がある。オプションの中では最も重要。</dd>
  <dt>&lt;changefreq&gt;</dt>
  <dd>ページの更新頻度。always, hourly, daily, weekly, monthly, yearly, never のいずれか。</dd>
  <dt>&lt;priority&gt;</dt>
  <dd>URL の優先度。0.0 から 1.0 までの値が指定できる。指定されない場合はデフォルト 0.5 になる。</dd>
</dl>

## 注意事項

- UTF-8 で作成すること。
- データ値は必要に応じてエスケープ処理をする。
- URLは重複していない固有のURLを記載すること。wwwあり/なしは統一すること。
- URLが50,000以上になる場合はサイトマップインデックスファイルを作成し、複数のサイトマップを作成する。
- sitemap.xmlはルートディレクトリに置くこと。
- ファイルサイズは 10MB 以下にする必要がある。ファイルサイズが大きい場合はgzip形式で圧縮する。

## 勘違いしやすいこと

- &lt;changefreq&gt; で always を指定したからといって頻繁にクロールしてくれるのを約束するわけではなく、never を指定したからといって１度しかクロールしないわけでもない。あくまでクローラーへの参考として記述する。
- &lt;priority&gt; は他のサイトとの比較ではなく、自サイト内での相対関係を示すもの。高い値を指定したからと言って上位表示されるわけではない。すべてのページに 1.0 を指定しても意味がない。あくまでクローラーへの参考として記述する。

# &lt;?xml?&gt;

XMLのバージョンとエンコードを指定する。UTF-8を指定する必要があるため以下のようになる。

```xml
<?xml version="1.0" encoding="UTF-8"?>
```

# &lt;urlset&gt;

属性のxmlnsでネームスペースを指定する。
XML文書はタグ名を自由に設定できる仕様だが、XML文書が何の文書なのかを示さないとurlタグが何のURLなのか、priorityタグがなんの優先度を示すのかが分からない。
そこでネームスペース（名前空間）を指定することでXML文書の情報の種類やタグの意味を理解できるようになる。
ここでは情報がサイトマップであること、サイトマップのタグのルールで書かれていることを示している。
なお、ネームスペースは名前なのでURLを指定しているわけではないが、ネームスペースは一意である必要がある。URLであれば一意になるため、ネームスペースはURLになっていることが多い。

最低限の記述は以下のようになる。

```xml
<urlset xmlns=”http://www.sitemaps.org/schemas/sitemap/0.9″>
```

以下はサイトマップのルールが書かれた XML Schema のURLまで指定したもの。
schemaLocation の書き方を示す名前空間が xmlns:xsi で指定されている。
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd にサイトマップのタグのルールが書かれている。

```xml
<urlset
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"   ←デフォルトのネームスペース。サイトマップを指定。
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ←xsi接頭辞のネームスペース。XML Schema のURLを指定。
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> ←XML Schema の実際のURLを指定。
```

以下は動画コンテンツ用のサイトマップのネームスペースを追加したもの。
クローラに動画に関する要素や属性を使用していることを伝えられ、動画検索に使われる。

```xml
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
```

ネームスペースにはその他に画像用やニュース用もある。詳細は Google Search Console のヘルプを。

動画
https://support.google.com/webmasters/answer/80471
画像
https://support.google.com/webmasters/answer/178636
ニュース
https://support.google.com/webmasters/answer/9606710

# &lt;url&gt;

各URLエントリの親要素。URLの数だけ用意する。
URLを記述するタグではないことに注意。

# &lt;loc&gt;

クローラーにクロールさせるURLを記述する。2,048 文字以下で指定する必要がある。
URLは重複していない固有のURLを記載すること。wwwあり/なしは統一しておく必要がある。
インデックスさせたくないnoindexやcanonicalが別のURLになっているページのURLは記述しない。

# &lt;lastmod&gt;

ファイルの最終更新日。W3C Datetime 形式で記述する必要がある。オプションの中では最も重要。
最後のクロールよりも新しい日時の<lastmod>が付いたURLのクロールをGooglebotは優先する。

W3C Datetime 形式には以下がある。

| フォーマット | 表記例 | 内容 |
|:-----------|:------------|:------------|
|`YYYY-MM-DD`|2020-02-20|年月日のみ|
|`YYYY-MM-DDThh:mmTZD`|2020-02-20T20:20+09:00|分まで指定|
|`YYYY-MM-DDThh:mm:ssTZD`|2020-02-20T20:20:20+09:00|秒まで指定|
|`YYYY-MM-DDThh:mm:ss.sTZD`|2020-02-20T20:20:20.45+09:00|10進数での小数秒まで|

W3C Datetime
https://www.w3.org/TR/NOTE-datetime

# &lt;changefreq&gt;

ページの更新頻度。always, hourly, daily, weekly, monthly, yearly, never のいずれか。
それぞれの意味は以下の通り。

| 表記 | 意味 |
|:-----------|:------------|
| always | アクセスする度に更新されるページ |
| hourly | １時間毎に更新されるページ |
| daily | 毎日更新されるページ |
| weekly | １週間毎に更新されるページ |
| monthly | １ヶ月毎に更新されるページ |
| yearly | １年毎に更新されるページ |
| never | 更新のないアーカイブページ |

always を指定したからといって頻繁にクロールするのを約束するわけではなく、
never を指定したからといって１度しかクロールしないわけでもない。
あくまでクローラーへの参考として記述する。

# &lt;priority&gt;

URL の優先度。0.0 から 1.0 までの値が指定できる。指定されない場合はデフォルト 0.5 になる。
他のサイトとの比較ではなく、自サイト内での相対関係を示すもの。
高い値を指定したからと言って上位表示されるわけではない。
すべてのページに 1.0 を指定すると効果がなくなる。あくまでクローラーへの参考として記述する。