後日のチャネルの増設などに対応するために、より柔軟に利用できる hasTag() メソッドの利用も検討してください。
オブジェクト索引
Channel オブジェクトは、コンテンツ配信先を表すオブジェクトです。
展開やメソッド中で channel() 関数を使用すると、その展開処理の対象となっている Channel オブジェクトが得られます。得られた Channel オブジェクトを通してチャネルの属性を調べることで、そのチャネルに応じたコンテンツを生成することができます。
メソッド名 | 説明 |
---|---|
channelName() | チャネル名を返す |
displayName() | チャネル表示名を返す |
hasTag(tag) | このチャネルが指定されたタグを持っているかどうか調べる |
isPrimary() | プライマリチャネルであるかを判定する |
channelName() メソッドは、チャネルの名称を返します。返される名前は「チャネル設定」画面の「チャネル名」欄に指定してある名前です。
テンプレートの展開やメソッド内で、処理中のチャネルの名前を参照し、そのチャネルに適したコンテンツを生成します。
<body>
........
<wr-if condition='channel().channelName() == "tablet"'>
........
タブレットデバイス向けの展開
........
</wr-if>
<wr-if condition='channel().channelName() == "mobile"'>
........
モバイルデバイス(スマートフォン)向けの展開
........
</wr-if>
........
</body>
展開中で channel().channelName() という式を書くのと、channelName() 関数を呼び出すのとは同じ結果になります。
displayName() メソッドは、チャネルの名称を返します。返される名前は「チャネル設定」画面の「チャネル表示名」欄に指定してある名前です。
テンプレートの展開やメソッド内で、処理中のチャネルの表示名を参照しコンテンツ内で使用します。
<head>
........
<title>%pageTitle()% | %channel().displayName()%</title>
........
</head>
この例では、ページのタイトルにチャネルの表示名を埋め込み、ユーザがどのチャネル(デバイス)向けのコンテンツを閲覧しているかがわかるようにしています。
チャネルの表示名には、それぞれのチャネルで「PC版」や「モバイル版」といった、チャネルが想定しているデバイスのクラスを示す名前が指定されているものとします。
表示名には任意の文字列を指定できます。表示名の使い方は自由ですが、表示名にはコンテンツ中で使用するための名前を指定しておくとよいでしょう。
hasTag() メソッドは、このチャネルが指定されたタグを持っているかどうかを調べる時に使用します。チャネルには任意個のタグをつけることができます。タグは「チャネル設定」画面で指定することができます。このメソッドで、チャネルに付けられている複数のタグの中に tag に指定された綴りと一致するタグがあるかどうか調べることができます。タグには空白文字以外の任意の文字が使えます。タグの一致判定では大文字と小文字が区別されます。
チャネルのタグを使うことで、同じタグを持つ複数のチャネルをひとつのグループにまとめて扱うことができるようになります。また、ひとつのチャネルに複数のタグを付けられるので、チャネルを複数のグループに属するようにして扱うこともできるようになります。
このチャネルにつけられているかどうかを調べたいタグを文字列で指定します。例えば "mobile" などを指定します。
このチャネルが引数 tag に指定されたタグを持っている場合に true を返します。
サイトには 4 つのチャネルが定義されているとします。それぞれのチャネル名が main, main2, mobile, mobile2 とします。main と main2 には "PC" というタグが付けられていて、mobile と mobile2 には "Mobile" というタグが付けられているとします。
<body>
........
<wr-if condition='channel().hasTag("PC") '>
ここに展開されたコンテンツは PC というタグの付いているチャネルに配信されます。
この例では main と main2 というチャネルに配信されることになります。
</wr-if>
<wr-if condition='channel().hasTag("Mobile") '>
ここに展開されたコンテンツは Mobile というタグの付いているチャネルに配信されます。
この例では mobile と mobile2 というチャネルに配信されることになります。
</wr-if>
........
</body>
テンプレート内でコンテンツの配信先を判定する場合、channel().chanellName() でチャネル名で判定するのではなく、あらかじめタグを使って判定するようにしておけば、後でチャネルを増設した場合にも、新しく増設したチャネルに配信するコンテンツを簡単にコントロールできるでしょう。
isPrimary() メソッドは、そのチャネルがプライマリである場合に true を返します。ひとつのサイトには複数のチャネルを定義することができますが、その中に、必ずひとつだけ、プライマリチャネルがあります。
プライマリチャネルは、デフォルトのチャネルでもあります。Web Server にアクセスしてきたユーザのブラウザの User-Agent から、どのチャネルのコンテンツをリプライすべきかを判断し、デバイスに応じたコンテンツを提供することができますが、User-Agent からチャネルを決定するルールのいずれにも該当しないブラウザに対しては、プライマリチャネルのコンテンツが返送されます。
プライマリではないチャネルのコンテンツを生成する場合に、head 節に link rel="canonical" を宣言し、検索エンジン等に対して、インデクシングすべきオリジナルのページの URL を供給してみます。
<head>
........
<wr-if condition="channel().isPrimary() != true">
<link rel="canonical" href="%thisPage().canonicalURL()%"/>
</wr-if>
........
</head>
channel() 関数で処理中の Channel オブジェクトを取得し、取得した Channel オブジェクトに対して isPrimary() メソッドを呼び出してチャネルがプライマリかどうかを調べます。チャネルがプライマリではない場合には、そのページの canonicalURL として、対応するプライマリチャネルのページの URL を canonical として宣言します。
複数のチャネルを定義し、各種のデバイスに最適化されたコンテンツを配信している状況では、複数のコンテンツのセットが、いわゆる「重複コンテンツ」を形成しています。つまり、コンテンツとしてはほぼ同じ内容であるにもかかわらず、形式(マークアップなど)の細部が異なる、複数のコンテンツのセットがネット上に公開されている状態になっているわけです。
検索エンジン等に対しては、複数のコンテンツセットのうちのひとつを canonical であると宣言し、そのコンテンツについてインデクシングを行うよう促しておくと良いでしょう。
プライマリチャネルを canonical としておけば、検索エンジン経由で様々なデバイスからのアクセスを受けた場合でも、最初のアクセスをプライマリチャネルで受け取ることでチャネル判定ルールが動作し、アクセスしてきたデバイスに最適なチャネルのコンテンツを配信することができます。