CakePHPでレイアウトにkeywordsとdescriptionを設定する
CakePHP1.3でページ毎にkeywordsとdescriptionを設定する方法を考えてみました。
CakePHPでサイトを構築した場合、通常、メタ情報を含めたヘッダ部分はレイアウト機能で共通化します。その中でも、keywordsやdescriptionといったページ毎に動的に切り替えたい部分があります。今回は、そのしくみについていろいろと試してみました。
Htmlヘルパーのmeta関数を用いる
Htmlヘルパーではmeta情報を出力するために関数が用意されています。例えば、keywordsタグを出力したい場合、ビューで以下のように設定します。
<?php echo $html->meta('keywords', 'キーワード1,キーワード2,キーワード3') ?>
その出力結果は以下の通りです。
<meta name="keywords" content="キーワード1,キーワード2,キーワード3" />
しかし、このままでは1つ問題があります。それは、ビューでmeta関数をコールした箇所に出力されてしまうということです。
「$script_for_layout」では設定したcssやjavascriptをメタタグ内に出力してくれますが、meta関数はそれとは異なるようです。したがって、ビュー内のmeta関数を置く場所や、レイアウトとビューの構成を工夫しなければ、正しい位置にkeywordsを設定することはできません。
あまりスマートな感じがしませんね。
予め独自のデータ枠を用意しておく
なるべくシンプルな構成をと、繰り返し試していたのですが、結局、予めレイアウトにデータ枠を用意しておくことに落ち着きました。
CakePHPにはレイアウト用に「script_for_layout」や「script_for_title」というデータが用意されていますが、これに合わせて「script_for_keywords」「script_for_description」を独自で用意します。
以下、レイアウトの記述です。
<?php if(isset($description_for_layout)){ echo "<meta name='description' content='" . $description_for_layout . "' />n"; } ?> <?php if(isset($keywords_for_layout)){ echo "<meta name='keywords' content='" . $keywords_for_layout . "' />n"; } ?>
次に、以下のようにコントローラで、必要に応じてアクション内で値をセットします。
$this->set('keywords_for_layout', 'キーワード1,キーワード2,キーワード3'); $this->set('description_for_layout', 'ダミーディスクリプションダミーディスクリプションダミーディスクリプション...');
すると以下のように出力されます。
<meta name="keywords" content="キーワード1,キーワード2,キーワード3" /> <meta name="description" content="ダミーディスクリプションダミーディスクリプションダミーディスクリプション..." />
こうすることで、ページ毎やコントローラ毎に切り替えることもできれば、サイト共通で値を持たせることもできます。また、「script_for_title」などと基本的に同じ考え方なので、直感的にも管理しやすいですね。
すばらしい! 悩んだ部分です。参考にさせて頂きました。