サイトマップXMLが欲しいならCakePHPで作れば良いじゃない

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
さーて、本日のあかつきのお宿は……。

こんにちは。管理人です。

夏の暑さは止むことを知らず、暑さに弱い私は病むことしか知らず、週末なんかは家から一歩も出ない生活を送っておりますが、しかしうっかり食材の買い置きがなくなっちゃったりするとあら大変。食べる物がない、でも家からは出たくない。ならば出前を頼めば良いじゃないってことで、夏バテで若干食欲が落ちている気がしつつも一人でピザ食って「ああ、また体重がピザキログラムに近づいたにゃー……」とかやっている、そんな夏下がりです。

今日のあかつきのお宿は

動的URLの前ではあまりにも無意味だった
sitemap.xmlのURLを生成しちゃう?
shellで自動作成しちゃう?

の三本です。



動的URLの前ではあまりにも無意味だった

以前、サイトマップを自動更新してみる的なことを書いたんですけど、考えてみたらあの方法って、サーバーに置いてあるファイルを端からサイトマップに反映させるような処理を行うものだから、うちのサイトみたいに動的にURLを作ってる場合って、あまり意味なかったですね。

いや、まあ、前回の記事ではごっそり省略してしまった部分の一つに『accesslog ~』ってのがあったんですけど、それをちゃんと設定すれば、動的なURLも含めてサイトマップを生成してくれます。相も変わらずさくらサーバーの話になるんですけど、さくらサーバーの場合、管理画面でアクセスログを残す設定があるので、それをやっとくと、サーバー上にアクセスログのファイルができる。そしてアクセスログファイルがあると、サイトマップを作るときにそこのログにあるURLも含めてくれるって寸法ですね。動的なURLはそうやって作るみたいですね。



でもあかつきのお宿の場合は、むしろ動的なURLしか要らないんですよね。静的ファイルってなるとcssとかjsとか画像とか、あとはwordpressのライブラリとか、そういうのしかないんで、別にそんなものはサイトマップに入れる必要はない。ってか入れなくない。そんなのインデックスされても困っちゃいますからね。

っていうか、まあ、実際に困っちゃったわけですね。

googleのウェブマスターツールを見たらね。何かやたらとクロールエラーが出てんの。そんでもって「404とか500エラーが多過ぎんぞ。てめーんとこのプールはどうなってんだ? クロールどころか平泳ぎすら満足にできねえよ」って感じの忠告が出てんの。

おかしいなぁと思って実際にエラーが出ているURLを見てみたら、ほとんどがwordpressのファイルだったっていうね……このおバカさんが。

そんときに気づいたわけですわ。前回やったサイトマップの生成法だと、サーバー上にあるファイルでしかサイトマップが作られない。アクセスログの設定すらしてなかったですからね。つまり限りなく無意味だったと。そりゃgoogleさんも忠告してくるわと。

そんなわけで、googleさんが提供しているサイトマップ生成プログラムは止めて、自分で作ることにしました。



sitemap.xmlのURLを生成しちゃう?

CakePHPでやろうと思った場合、やり方は二つあります。

一つは、サイトマップ用のコントローラーを作成する。

要はサイトマップ用のURLを用意しちゃうってことですね。routes.phpでちょちょいと設定を書いてやれば、googleのクローラーさんだかバタフライヤーさんだかが来た時に、そのコントローラーに書かれている処理を実行してくれるようになります。

例えばこんな感じ

//router.php
Router::connect('/sitemap.xml', array('controller' => 'sitemap', 'action' => 'index'));

//SitemapController.php
class SitemapController extends AppController {
    function index() {
        //サイトマップ作成処理を書く
    }
}

これで、sitemap.xmlに誰かがアクセスして来た時は、この作成処理が走るようになります。自分でXML書くの面倒じゃねって思うかもしれないけど、そんなこともないぞよ。どうせループで回すんだから、書くことなんてたいしてありしまへん。

あ、ちなみにこの方法をやる場合は、サーバー上からsitemap.xmlのファイルは削除しておくよーに。ファイルが残ってるとそっちが優先的に読み込まれちゃうからね。まあ、.htaccessとかの設定次第って気もするけど、そーゆーのはよく分かんないからパス。削除した方が早い。どうせもう使わないんだし。



shellで自動作成しちゃう?

もう一つは、cronを利用して、定期的にsitemap.xmlファイルを生成、上書きするって方法ですね。

その場合はコントローラーじゃなくて、シェルを用意する。CakePHP1.2とか1.3だと『vendors』ってフォルダの下に『shells』ってフォルダがあるから、その下に『sitemap.php』みたいなファイルを用意する。CakePHP2.0だと『Console』ってフォルダがあるから、その下に『SitemapShell.php』みたいなファイルを用意する。

//SitemapShell.php
class SitemapShell extends Shell {
    function createSitemap() {
        //sitemap.xmlファイルの作成処理を書く
    }
}

//cronの設定(さくらサーバーの場合)
0 0 * * * /usr/local/bin/php /home/アカウント/cake/Cake/Console/cake.php Sitemap createSitemap -app /home/アカウント/cake/app 1> /dev/null

cronの設定に関してはディレクトリの構成とかによって変わるから、あくまでも一例ね。さくらサーバーで動いているあかつきのお宿の場合だと、こんな感じになるってことで。基本的な書き方は同じだから、あとは自分のサーバーのディレクトリ構成と相談ってことでおねげーします。



あかつきのお宿の現状とやっぱり無意味だった点

あれ? 三本立てって言ってたのに、四本立てになっちゃった……ま、いっか。3も4も変わらないよね。人は物を数えるとき、1、2、たくさんって数えるもんね。

あと別にこの項目は蛇足なので、読む価値はないっす。小説で言うところの巻末のあとがきみたいなもんっす。あ、いや、あとがきの方は読む価値あるか、うん。



さて、あかつきのお宿では現在、2番目のshellの方で毎日一回、sitemap.xmlを作ってます。基本的には毎日何かしらのコンテンツを更新しているので、一日一回更新すればちょうど良いやって感じなんですけど……

考えてみたら、自分でデータベースにアクセスしてデータをぶっこ抜いて来て、それを元にサイトマップを作成する場合、コントローラーを作成する方ならともかく、シェルの方は別にこんなことやらなくても良いんですよね。

基本的には毎日とは言っても、更新しない日もあるわけだし、何かの拍子に血迷って急に無人島に行きたくなったから一ヶ月くらい更新休むわ~ってなる可能性だって、ゼロではないですからね。量子力学の観点から言えば、未来は決まってないんですから。

一ヶ月も更新を休んだ場合、それでもサイトマップの方は毎日せっせと更新されるわけです。特に何の情報も増えていないのに、穴を掘っては埋めてまた掘る囚人のように、同じことを繰り返すわけです。

だからまあ、もしも僕と同じような境遇の人で、2番目の案に「おお! それ採用!」って思ってくれた人は、それをやらないで、実際にブログの記事を投稿したりとか、ここで言えば小説とか音楽とかが投稿されたときに、サイトマップの方も更新する処理を入れればそれでオッケーだと思います。そっちの方が無駄がない気がする。

NovelsController extends AppController {
    function add() {
        if($this->Novel->save()) {
            //sitemap.xmlファイルの作成処理を書く
        }
    }
}

例えばこんな感じでね。

wordpressの場合だと、記事の投稿に合わせて処理を書くのはちょいと面倒かもしれないけど、アクションフックってやつが分かれば、そんなに難しくはないです。

今回はそこについては省略。実際に試してないし、もしこの記事を見に来てくれた人に需要があると分かったら、そんときは実験してみます。



んじゃ、そーゆーことで、また来週お会いしましょう。



じゃん、けん、ぽん!

うふふ♪
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください