Railsでサイトマップを作る方法

プログラミング
投稿日2019年07月05日 10:00

概要

GoogleやBingなどの検索エンジンのクローラに、クロールしてほしいWebページを知らせる方法にサイトマップというものがあります。
サイトマップでは、XML形式でアクセスしてほしいURLが書かれています。

今回は、このサイトマップをRailsで生成する方法について紹介します。

環境

  • Rails 5.2
  • sitemap_generator 6.0

gemを使う

サイトマップの作成では、まずページをサイトマップに含めるか決定する必要があります。
そのページが決まったら、サイトマップを作成します。
自分自身でXMLを作るのは、フォーマットが決まっているため結構面倒です。
そこで、サイトマップの作成には、sitemap_generatorというgemを使います。

インストール

まず、インストールのためにGemfileに次のように追記します。

gem 'sitemap_generator'

次のコマンドでgemをインストールします。

bundle install

これでインストールは終わりです。

使用方法

次のコマンドでサイトマップを作成するためのファイルを作成します。

rake sitemap:install

設定ファイルはconfig/sitemap.rbにあります。
内容自体は単純です。

SitemapGenerator::Sitemap.createにサイトマップに追加したいページのパスを追加する処理を書いたブロックを指定します。
ブロックの中ではaddメソッドを使ってサイトマップに追加するページを指定します。
addメソッドの引数には、Railsが生成するroutes.rbの内容をもとに生成する***_pathメソッドが使えるのでそれを使ってパスを作成します。

例えば、次のように書くことができます。

SitemapGenerator::Sitemap.create do
  add pages_path
  add categories_path
  add tags_path

  Article.all.find_each do |article|
    add article_path(article), changefreq: 'daily', priority: 0.8, lastmod: article.updated_at
  end
end

addメソッドは、eachなどの繰り返し処理の中でも使うことができます。
そのため、例えば動的に作成される記事のようなものであれば、全ての記事をサイトマップに登録したい場合eachやfind_eachメソッドでそれぞれの記事を取り出しそれぞれでaddメソッドを使うという使い方ができます。

addメソッドの引数にはパス以外にもサイトマップで使われるchangefreqやlastmodなどの値を設定することもできます。

これだけでは、設定ファイルができただけなので、サイトマップはできていません。

サイトマップの作成は次のコマンドでできます。

rake sitemap:refresh

サイトマップはconfig/sitemap.xml.gzにできるので、もしWebサーバからsitemapにアクセスしたい場合は http://localhost:3000/sitemap.xml.gz のようにアクセスします。
gzとなっていることからgzipで圧縮されたファイルということがわかると思いますが、サイトマップはサイズが大きくなりやすいので、gzipのものであればクローラが勝手に解凍して解釈してくれます。

今のコマンドではサイトマップの更新をしたということを検索エンジンに通知することになります。
そのため、次のようにすることで通知をせずにサイトマップだけを作成します。

rake sitemap:refresh:no_ping

定期的に実行

このままでは、例えば記事を更新した場合にサイトマップを更新することができません。
そこで、サイトマップを定期的に作成・更新する方法があります。

ここではあまり詳しく説明しませんが、wheneverなどのgemを使ったりcronなどを直接使って定期的にサイトマップを作成するコマンドを実行する方法があります。

ちなみにサイトマップの更新の際にもサイトマップの作成と同じコマンドを使います。

rake sitemap:refresh

さいごに

検索エンジンからの表示をしたいのであれば、サイトマップを使ったほうがクローラが効果的にクロールできるようになるため、より表示されるようになります。

もし、Webサイトを公開するのであればサイトマップを作成するようにしましょう。