サイトのSEO対策として、
Google Sitemap用のXMLファイルを作成しました。

今回は、Rails Pluginを使用して実装してみました。

1.Mephisto Google Sitemap Plugin
関連リンク:SEO on Rails
プラグインをインストールしてみたが、うまく動作せず・・・諦めた。

2.generate_sitemap

関連リンク:Plugins – Generate Sitemap Task
railsで簡単にgoogle sitemapsを作る
svnは、見つかりませんでした。
下のほうにテキストで、tarソースを公開してます。
ソースが見つかったので、こちらを拝借させてもらいます。

まず始めに、このプラグインで必要なものをgemでインストールします。
Hpricot – http://code.whytheluckystiff.net/hpricot/
Builder – http://rubyforge.org/projects/builder/

gem install Hpricot
gem install Builder

リポジトリを探すのに1時間ぐらいかかった。[emoji:i-229] オモタィ

tar解凍後のファイルを以下にコピー
/vendor/plugins/generate_sitemap/
-README
-Rakefile
+tasks
-generate_sitemap.rake

このプラグインの挙動は、サイトをクロールしてアンカータグを取得し、XMLファイルにするというものです。
実行は、コンソールからできますのでcronに設定して、定期実行させます。

基本設定は、

15行目ぐらいのクロールするドメイン名を変更

DOMAIN = 'www.your-domain.com:3000'

25行目ぐらいのクロールを開始するパスを変更

# start with home page
crawl_for_links('/home/')

1件の不具合
アンカータグのmailtoが取得されてしまうようです。
should_be_includedを次の様に変更しました。

  def should_be_included?(str)
    if str.include?('http://')
      return false
    elsif str.include?('mailto:')
      return false
    elsif str.include?('account') #不要なControllerのURLは除外
      return false
    elsif str.include?('new') #不要なActionのURLは除外
      return false
    elsif str.include?('edit')
      return false
    elsif str.include?('destroy')
      return false
    elsif str.include?('//')
      return false
    elsif str == '/'
      return true
    elsif str.include?(BASE_URL)
      return true
    elsif str.slice(0,1) == "#"
      return false
    else
      return true
    end
  end

2件のカスタマイズ
リンクの数から、sitemapのpriority(page rankみたいなもの)を算出する。

    @pages.each {|page|
      crawl_for_links(page) unless @pages_crawled.include?(page)
    }

    #以下4行を追加
    @page_ranks = Hash.new(0)
    @pages.each { |e|
      @page_ranks[e] += 1
    }

40行目ぐらいにある、下記のコードを書き換える。

    xml.urlset("xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9") {
      # loop through array of pages, and build sitemap.xml
      @page_ranks.keys.sort.each {|link|
        xml.url {
          xml.loc BASE_URL + link
          # TODO - set changefreq
          #xml.changefreq 'monthly'
          xml.priority rank_calc(@page_ranks[link], @pages.length)
        }
      }
    }
  #page_rank
  def rank_calc(top, bottom)
    top = top.to_f
    bottom = bottom.to_f
    ans = (top / bottom * 100).to_i
    if ans == 0
      return "0.1"
    elsif ans > 9
      return "1.0"
    else
      return "0.#{ans.to_s}"
    end
  end

最後に実行します。完了![emoji:i-234]

cd /rails_apps/
rake --trace plugin:generate_sitemap

作業工数は、5時間ぐらいでした。