PHPで動的にサイトアップ(sitemap.xml)ファイルを生成する
MovableTypeやWordpressなどでサイトを管理している場合、自動的にサイトマップやRSSを発行してくれるのでよいのですが、通常のサイトでそれを実現するのは難しいです。特にページ数の多いサイトだと、手動でサイトマップを更新していくのは至難の業ですね。
そこで、今回はPHPプログラミングを活用して、静的なサイトで自動的にサイトマップを作成したいと思います。
PHPではディレクトリを開く関数「opendir」とディレクトリを読み込む関数「readdir」があります。
これを使い、
- opendirでディレクトリを開きreaddirでパスのリストを取得する
- パスを一つずつ見てファイルの場合は出力する
- ディレクトリの場合は再びopendirでディレクトリを開く
といった処理を繰り返して、最終的にファイルのリストを出力します。
サンプルソースは以下のとおりです。
// 処理スタート outputFileList("."); function outputFileList($path){ // ディレクトリでなければ終了 if (!is_dir($path)) { return false; } $tmp_dir = array(); if ($handle = opendir($path)) { // 取得したパスを一つずつ見ていく while (false !== ($file = readdir($handle))) { // 自分自身と上位階層のディレクトリを除外 if ('.' == $file || '..' == $file) { continue; } // パスを整形 $tmp_path = $path . '/' . $file; // ディレクトリならば自分自身を呼び出し再起処理 if (is_dir($tmp_path)) { $tmp_dir[$file] = outputFileList($tmp_path); } // ファイルならばパスを出力 else if(is_file($tmp_path)) { $tmp_dir[$file] = $tmp_path; // パスを出力 echo $tmp_path; } } closedir($handle); } return $tmp_dir; }
まず、関数outputFileListを呼び出して処理をスタートしています。任意の引数は、例えば「”.”」とすることで、そのファイルが置いてあるディレクトリ以下のファイル一覧を取得します。ディレクトリをオープンしパスの一覧を取得する、そのパスを一つずつ見て、ディレクトリの場合は関数outputFileListをコールして再帰処理、ファイルの場合はファイルのパスを出力します。
これを繰り返すことで、ファイル一覧を取得することができます。
例えば、この処理を「sitemap.php」に実装して、ファイルのパスの他に、以下のテンプレートにあわせてタグを出力することで、サイトマップが完成します。
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://helog.jp/1.html</loc> <lastmod>2010-08-30T12:00:00Z</lastmod> </url> <url> <loc>https://helog.jp/2.html</loc> <lastmod>2010-08-30T12:00:00Z</lastmod> </url> <url> <loc>https://helog.jp/3.html</loc> <lastmod>2010-08-30T12:00:00Z</lastmod> </url> (繰り返し) </urlset>
ファイルの更新日時である「lastmod」については、PHPの関数「filemtime」で取得することができますね。
この方法では、実在するファイルを調べてパスを生成しているので、逆にCMSなど動的なサイトでは使えません。また、上の処理のままだとJPGやGIFなどの画像ファイル、JSやCSSなどのファイルまで一覧に出力してしまうので、HTMLファイルの拡張子で絞るなどの工夫は必要でしょうね。
あとはこの「sitemap.php」をGoogleウェブマスターツールやYahoo!サイトエクスプローラーに登録するだけです。
コメントする