スマートフォンやhtml5+CSS3など新技術に四苦八苦。jQuery、AjaxなどJavaScriptも難しいですね。そんなWebに悩む人のネタ帳です。

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」などと基本的に同じ考え方なので、直感的にも管理しやすいですね。

このエントリーをはてなブックマークに追加

Comment

Comment Form

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Monthly Archives

Search