🐙

サイトマップをLaravelで自作する

2022/05/04に公開

サイトマップを Laravel で作ろうとした時、検索したら laravel-sitemap というパッケージがあるのですが、どうしても導入する気にならなかったのです..。

その理由としてはアップデート最終年月です。

https://github.com/Laravelium/laravel-sitemap

最終更新リリースが 2020 年 9 月となっています。

セキュリティ的に心配だし、使うべきなのでしょうか。

他にもライブラリはあるのですが、ライブラリ使うほどのものか という疑問も(ライブラリの記述方法を覚えるのクソめんどいなという怠惰)

サイトマップは自作すれば良いのでは。ということで自作することとしました。

自作の方法として2つの方法があります。

  1. Commands を利用して定時バッチで実行して生成する
  2. MVC の View でサイトマップファイルを表示する

1 に関しては、AWS や GCP にデプロイ後、特定のディレクトリに対して書き込み権限がないとデプロイ後実際にファイルが生成していないというトラブルもありました。

そのため、今回は 2 で自作することとしました。

サイトマップとは

そもそも、サイトマップとは、Google などの検索エンジンや閲覧ユーザーに対して Web ページの存在を促すことができるものです。

名前の通り、サイトの地図のようなものですので、どこのページにどのページがあるのかの構成をユーザーもしくはクローラーに対し、わかりやすく伝えることができます。

ちなみにサイトマップに関しては、必ずしも作成しなくても大丈夫で、作成するべき Web サイトというものが Google 側で指標として示されています。

下記に当てはまるようなサイトの場合、作成した方が良いかと思われます。

  • サイトのサイズが非常に大きい。
  • サイトにどこからもリンクされていない、または適切にリンクされていないコンテンツ ページのアーカイブが大量にある。
  • サイトが新しく、外部からのリンクが少ない。
  • サイトに動画や画像などのリッチメディア コンテンツが多数含まれている、またはサイトが Google ニュースに表示されている。

引用元:サイトマップについて – Search Console ヘルプ

つまり、作成したばかりの Web ページではもれなく導入した方が良さそうです。

せっかく作成した Web サイトが検索エンジン等に認識されない限り、検索結果に表示されず、誰からも見てもらえない悲しい結果となってしまいます。

サイトマップの種類

実は、一概にサイトマップといっても、2 種類のサイトマップがあります。

おそらく私たちが普段目にするサイトマップは「HTML サイトマップ」と呼ばれるものです。

検索エンジン用の「XML サイトマップ」もあります。

それぞれ形式、用途、目的が異なりますので、それらの違いについて説明します。

HTML サイトマップ

私たちが普段目にするサイトマップはこちらのサイトマップです。

HTML によって記述されており、Web ページのリンクをリスト形式などで整理して表示し、ユーザーが探しているコンテンツを見つけやすいように設置しています。

各ページのリンクがまとめられているため、ユーザーがサイト内で迷子になることなく目的のページにたどり着きやすくなるため、ユーザビリティの向上が目的となっています。

XML サイトマップ

こちらは、検索エンジン(Google 等)のために設置するサイトマップです。

Web サイトのコンテンツに関する情報を検索エンジンに一気にお知らせし、検索エンジンのクローラーを補助し、インデックスを促進する効果があります。

XML サイトマップには下記情報が XML のファイル形式で含まれています。

XML は、Extensible Markup Language の略で、異なるアプリケーション間でも利用できるデータ記述用のマークアップ言語のことです。

下記のような情報が含まれています。

  • URL
  • 優先度
  • 最終更新日
  • 更新頻度などの情報

XML サイトマップは Google が公式にサポートして推奨してるファイル形式であり、サイズや指定できる URL の数に制限があります。

サイトマップの SEO 効果

Web サイト状況によっては、検索エンジンにしっかり認識されず、検索エンジンに評価されないという可能性があります。

Web サイトでは、最新記事(新規 URL)が作成され、クローラーがそのページを訪れるとクローラーによるインデックスが行われ、自然と検索結果に表示されます。

しかし、インデックスしてもらうためには数日から1ヶ月程度かかる場合もあり、インデックス期間に関して Google から明確な回答がありません。

新しく作った良質な Web ページは、なるべく早くインデックスしてもらい、検索結果に表示してもらいたいですよね。

検索結果に速く表示させるためには、サイトマップの設置が効果的という訳です。

サイトマップの作成方法

XML サイトマップの作成について Wordpress 等では、作成プラグインがあるので簡単に作成が可能です。

XML サイトマップは自作も可能で、コンテンツに適した XML サイトマップを自作すると、より効果的なサイトマップにできます。

ここからはサイトマップを作成する手順を簡単に紹介します。

サイトマップの基本構造

サイトマップの基本構造として、大きく親ファイルと子ファイルの2つに分かれています。

親ファイルで全体のサイトマップファイルを管理し、子ファイルに実際にクローリングしてほしい URL を記載する方法が良いです。

なぜ 1 つのサイトマップファイルにクローリングしてほしい URL をまとめないのか。

と疑問に感じる方も多いはずです。

実は、サイトマップは 1 つのファイルに URL は 50,000 個までという制限、ファイルサイズは 50MB までという制限があります。

最初のうちはそこまで URL は増えることがないはずですので、1つのファイルでまとめて記載でも問題ないです。

しかし、今後のページ増加に対応しきれなくなる可能性もありますので、初めから分けて作成した方が良いです。

ちなみに、ここでの親ファイルは子ファイルを呼び出すためのマッピングを親ファイルで記載するため「サイトマップインデックス」とも呼ばれます。

親ファイルと子ファイルについては、利用する XML タグが異なります。

親ファイル利用タグ 用途
sitemapindex(必須) すべての情報を囲むタグ。HTML ファイルでいう body タグのようなもの。
sitemap(必須) 個別の情報を囲むタグ。HTML ファイルでいう section タグのようなもの。
loc(必須) 子ファイル(XML ファイル)の URL を記述するタグ。
lastmod ファイルの最終更新日を記すタグ。
子ファイル利用タグ 用途
urlset(必須) 子ファイルのすべての情報を囲むタグ。親ファイルでいう sitemapindex タグ、HTML ファイルでいう body タグのようなもの。
url(必須) 個別の情報を囲むタグ。親ファイルでいう sitemap タグ、HTML ファイルでいう section タグのようなもの。
loc(必須) 個別のページ URL を記述するタグ。
lastmod ページの最終更新日を記すタグ。
changefreq ページの更新頻度を示すタグ(クロール頻度)。
priority ページ URL の優先度を示すタグ。優先度が高い順にクロールされてインデックされる。

基本的な書き方

Google が推奨する XML サイトマップの基本的な作成方法として、以下のような書き方・記述が例として紹介されてます。

親ファイル(サイトマップインデックスファイル)

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      <loc>http://www.example.com/sitemap1.xml.gz</loc>
      <lastmod>2004-10-01T18:23:17+00:00</lastmod>
   </sitemap>

   <sitemap>
      <loc>http://www.example.com/sitemap2.xml.gz</loc>
      <lastmod>2005-01-01</lastmod>
   </sitemap>
</sitemapindex>

上記<loc></loc>の指定が実際のサイトマップファイルになります。

子ファイル。

<?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>

   <url>
      <loc>http://www.example.com/catalog?item=12&amp;desc=vacation_hawaii</loc>
      <changefreq>weekly</changefreq>
   </url>

   <url>
      <loc>http://www.example.com/catalog?item=73&amp;desc=vacation_new_zealand</loc>
      <lastmod>2004-12-23</lastmod>
      <changefreq>weekly</changefreq>
   </url>

   <url>
      <loc>http://www.example.com/catalog?item=74&amp;desc=vacation_newfoundland</loc>
      <lastmod>2004-12-23T18:00:15+00:00</lastmod>
      <priority>0.3</priority>
   </url>

   <url>
      <loc>http://www.example.com/catalog?item=83&amp;desc=vacation_usa</loc>
      <lastmod>2004-11-23</lastmod>
   </url>
</urlset>

MVC を利用したサイトマップ表示

web.php にサイトマップ表示を指定します。

Route::get('/sitemap.xml', [SitemapController::class, 'index']);
Route::group(['prefix' => 'sitemap'], function () {
    Route::get('xxx.xml', [SitemapController::class, 'xxx']);
    Route::get('yyy.xml', [SitemapController::class, 'yyy']);
});

/sitemap.xml をサイトマップインデックスとし、/sitemap/xxx.xml 等を増やしていくことで、URL 数が多くなっても耐えうる構造とします。

<?php

namespace App\Http\Controllers;

class SitemapController extends Controller
{
    /**
     * サイトマップインデックスを表示する。
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        // データ取得処理を記載
        return response()->view('sitemap'. $data)
            ->header('Content-Type', 'text/xml');
    }

    /**
     * xxxページのサイトマップを表示する。
     *
     * @return \Illuminate\Http\Response
     */
    public function xxx()
    {
        // データ取得処理を記載
        return response()->view('xxx'. $data)
            ->header('Content-Type', 'text/xml');
    }
}

サイトマップインデックスファイル。

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>{{ env('APP_URL') }}/sitemap/xxx.xml</loc>
  </sitemap>
  <sitemap>
    <loc>{{ env('APP_URL') }}/sitemap/yyy.xml</loc>
  </sitemap>
</sitemapindex>

サイトマップファイル(xxx.xml)

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  @foreach ($pages as $page)
    <url>
      <loc>{{ $page['url'] }}</loc>
      <lastmod>{{ $page['updateOn'] }}</lastmod>
      <changefreq>{{ $updateFrequency }}</changefreq>
    </url>
  @endforeach
</urlset>

上記のような実装をすることでサイトマップ xml ファイルを blade で表示します。

※注意点としては、encoding の記述が php タグで記述しないと認識しないので、<?php ?> で囲ってあげる必要があります。

Google へのサイトマップ登録

サイトマップを Google で利用できるようにする方法はいくつかあります。

サイトマップ レポートを使用してサイトマップを管理します。

サイトマップ レポートを使用すると新しいサイトマップの Google への通知やサイトマップ送信履歴の確認、送信したサイトマップの解析結果を見ることができます。

ping ツールの使用

ブラウザの GET リクエストの送信かコマンドラインで下記のように URL を指定して実行する方法もあります。

(FULL_URL_OF_SITEMAP にサイトマップのファイルを指定)

https://www.google.com/ping?sitemap=FULL_URL_OF_SITEMAP

robots.txt ファイルに追記

Google は Web サイトの robots.txt をクロールするため、そこに記載する方法です。

robots.txt にサイトマップへのアクセス URL を指定します。

まとめ

今回は、サイトマップについての説明とその設定方法について簡単にご紹介しました。

Web ページを作成したら、SEO 対策は必須になります。

まだサイトマップ作成ができていないのでしたら、これを機に作成してみてください。

GitHubで編集を提案

Discussion