CakePHP 2.x 系でサイトマップ XML を作成します。サイトマップ XML についてわからない方は2年前に書いたサイトマップ XML 作成の基本を参照してください。今回はサイトマップ XML を CakePHP で動的に生成する方法について触れていきます。CakePHP 1.x 系での作成方法については下記のページにまとめてありますが、CakePHP 2.x 系のために書かれたコードではないため、本記事では下記のページのコードをベースに 2.x 系で使えるサイトマップ XML の作成コードを書いていきます。
コントローラを作成する
以下のようにサイトマップに関するコードを書いていきます。Time ヘルパーを使えるように宣言するところがミソです。サイトマップ XML には Routing で /sitemap.xml でアクセスできるようにすればよいので、コントローラー名は自由で構いません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php class ApiController extends AppController { public $uses = Array('Item'), $helpers = Array('Time'); public function sitemap() { $this->layout = "xml/default"; $data = $this->Item->find('all'); $this->set('data', $data); } } ?> |
今回は商品ページのみをサイトマップ化しますので、$data としてアクセスできるようにしています。商品ではなく、記事とかならそれに合わせて設定すれば良いと思います。
ルーティングを設定する
/sitemap.xml でアクセスしたらサイトマップ XML が出力されるように routes.php を設定します。ページ数が5万件以上あることが想定される場合はサイトマップインデックスファイルなどを使うと思いますので URL 構造も変わってきそうですので、ご自分の環境に合わせてください。
1 | Router::connect('/sitemap.xml', array('controller' => 'api', 'action' => 'sitemap')); |
ビューを作成する
xml/default.ctp
XML 用のレイアウトを作成します。XML のヘッダが直書きになっているのは、Xml ヘルパーが廃止されて $this->Xml->header() が消滅したけど代替方法が分からないためですが、直書きでも問題なく動きます。
1 2 3 4 5 | <?php // app/View/Layout/xml/default.ctp echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; echo $content_for_layout; ?> |
sitemap.ctp
サイトマップ用のビューを作成します。このファイルはあなたの環境に合わせて変わります。私の場合は ApiContoroller::sitemap() で出力するため View/Api/sitemap.ctp となります。このコードの詳細については以下で説明していきます。
1 2 3 4 5 6 7 8 9 | <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <?php foreach ($data as $d): ?> <url> <loc><?php echo $this->Html->url(Array('controller' => 'supplement', 'action' => $d['Item']['id']), true); ?></loc> <lastmod><?php echo date(DATE_W3C, strtotime($d['Item']['updated'])); ?></lastmod> <changefreq>weekly</changefreq> </url> <?php endforeach; ?> </urlset> |
URL の部分について
今回私で作成しているサイトは商品ページのパーマリンクが item/[0-9]+$ のようになってますので、このように出力しています。URL の出力は直書きでも構いませんが、CakePHP の HTML ヘルパーを使って出力させて頂きました。
最終更新日の日付部分
サイトマップ XML の日付の書式は “YYYY-MM-DD” 形式か W3C Datetime で記述します。詳細については別記事でまとめていますので、気になる方はそちらを参考にしてください。
各形式の日付出力方法
Time ヘルパーを使う方法もありそうですが、詳しくは調べていません。下記に参考になりそうなページをまとめましたので確認してください。
1 | echo date(DATE_W3C, strtotime($d['Item']['updated'])); |
- TimeHelper — Cookbook v2.x documentation
- cakephp/lib/Cake/View/Helper/TimeHelper.php at master · cakephp/cakephp
- API for CakePHP : The PHP Rapid Development Framework :: version 1.1.x.x
出力結果
以下のように出力されます。今回記事で紹介したコードそのままだと整形もしっかりされて綺麗です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://example.com/item/1</loc> <lastmod>2012-03-26T07:33:14+09:00</lastmod> <changefreq>weekly</changefreq> </url> <url> <loc>http://example.com/item/2</loc> <lastmod>2012-03-26T07:33:14+09:00</lastmod> <changefreq>weekly</changefreq> </url> <url> <loc>http://example.com/item/3</loc> <lastmod>2012-03-26T07:33:14+09:00</lastmod> <changefreq>weekly</changefreq> </url> </urlset> |
おわりに
今回は CakePHP 2.x についてより理解を深めることができました。CakePHP 2.x になって更にサイトを作りやすくなっているので、こちらも作成する上で、より CakePHP ライクな作り方を覚えて行きたいです。
コメント