drupal.orgには、関連コンテンツの表示のために特化したモジュールがたくさんありますが、Viewsという汎用的なモジュールでもある程度のことは可能です。Viewsを使用する方法としては、下のDrupalEasyさんのページで紹介されている方法を採用することが多いようです。現在表示するノードと同じタクソノミーターム持つコンテンツを表示させる方法です。既にご自身のサイトにViewsを導入済みで、タクソノミータームだけを判断基準に関連コンテンツを自動選択する方法で良いのであれば、Viewsを使用する方法がお手軽です。Viewsを使用すれば、投稿日時やセクション(ノードタイプなど)の情報を併せて表示するなど、お好みのブロックを簡単に作成できます。
Using Views 2 and Drupal 6 to Create a Related Pages Block | DrupalEasy
Viewsの設定法 - Drupal 6
STEP 1. 下準備
- View、そしてViews UIも有効化。
*Views UIを有効化しないと、GUIの設定画面を利用できません。因みにViews UIは設定が終わったら無効化したほうがいいです。開発時以外は有効化していても意味がなく、システムが複雑化するだけだと思います。
STEP 2. ノードタイプのviewを追加
- example.com/admin/build/viewsで[追加]タブをクリック。
- 次の画面で"View name"の欄に"related_posts"など、わかりやすいview nameを入力。
- "View type"という項目は"ノード"のまま[Next]ボタンをクリック。
STEP 3. Arguments欄に"ノード: Nid"を追加
- Arguments(引数)という項目の[+]ボタンをクリック。
- "ノード: Nid"にチェックを入れて[追加]ボタンをクリック。
- 続いて表示される"Defaults: Configure Argument ノード: Nid"という引数の詳細設定画面の"Action to take if argument is not present"という項目で"Provide default argument"を選択。
- "Provide default argument options"というフィールドセットの中の"Default argument type"で、"Node ID from URL"を選択。
- "Exclude the argument"にチェックを入れて、[更新]ボタンをクリック。
*このステップを踏まないと、関連コンテンツブロックの中に現在表示中のノードまで表示してしまいます。
STEP 4. Arguments欄に"タクソノミー: Term ID"を追加
- Arguments(引数)という項目の[+]ボタンをクリック。
- 引数を選択する画面が表示されるので、"タクソノミー: Term ID"にチェックを入れて[追加]ボタンをクリック。
- "Defaults: Configure Argument タクソノミー: Term ID"という引数の詳細設定画面で"Action to take if argument is not present"という項目で"Provide default argument"を選択。
- "Provide default argument options"というフィールドセットの中の"Default argument type"で"PHP Code"を選択し、"PHP argument code"の欄に次のスニペットをコピー&ペースト。
$node = node_load(arg(1));
if($node) {
foreach($node->taxonomy as $term) { $terms[] = $term->tid; }
return implode('+',$terms);
} else { return; }
- 同じ画面の下のほうの、"Allow multiple terms per argument."と、"Reduce duplicates"にチェックを入れて、[更新]ボタンをクリック。
STEP 5. フィールドにノードタイトルを追加
- フィールド[+]ボタンをクリック。
- 追加するフィールドを選択する画面で、"ノード: タイトル"をチェック。
- [追加]ボタンをクリック。
- "Defaults: Configure field ノード: タイトル"という詳細設定画面で、"ラベル"という欄の"タイトル"を削除。
- "Link this field to its node"をチェック。
- [更新]ボタンをクリック。
*ノードタイトル以外にもpost dateなどを入れるなど、お好みで設定してください。
STEP 6. フィルタを追加
ノードタイプのviewを作成するときは常にそうですが、非掲載となっているノードを表示しないようにフィルタを設定するべきです。下のように設定します。
- フィルタという項目の[+]ボタンをクリック。
- "ノード: 掲載"にチェックを入れて[追加]ボタンをクリック。
- "はい"にチェックを入れて[更新]ボタンをクリック。
*その他、特定のコンテンツタイプのノードだけを関連コンテンツとして表示したい場合には、"ノード: タイプ"というフィルタを設定することもできます。
STEP 7. タイトルを設定
- "Basic settings"の"タイトル"の"なし"をクリック。
- "関連コンテンツ"など、お好きなタイトルを入力。
STEP 8. ブロック表示を追加
画面左上のプルダウンメニューからブロックを選択し、[Add display]ボタンをクリックします。
- 左上のドロップダウンのセレクトリストから"ブロック"を選択。
- [Add display]ボタンをクリック。
STEP 9. これまでの設定を保存
- 最後に画面左下の[保存]ボタンをクリックするのを忘れずに!これをやらずに、別のページに遷移したり、キャンセルボタンを押すとこれまでの設定が保存されず、viewが完成しません。
後はadmin/build/blockで、ブロックを有効化するだけです。
ノードとコメントの間に関連コンテンツを表示する方法
ノードのすぐ下に関連コンテンツを表示したいという方は多いと思いますが、その方法が若干わかりにくいようです。ここでは2つだけ方法をご紹介します。
node.tpl.phpにリージョンを追加
CocoaSpaceで使用しているAdaptiveThemeには、デフォルトでノードのテンプレート内にリージョンがありますが、多くのテーマはそのようになっていないと思います。基本的にリージョンは、page.tpl.phpに記述されるものだからです。それをnode.tpl.phpからリージョンを呼び出せるようにするのは簡単です。AdaptiveThemeで採られている方法をご紹介します。
1. テーマの.infoファイルに下記のコードを追加。
regions[article_aside] = Article Aside
2. テーマのtemplate.phpファイルに下記のコードを追加。
THEMENAMEというところを、ご自分のテーマ名に置き換えてください。もしも既にTHEMENAME_preprocess_node()が存在している場合は、中身の部分(2-3行目)をfunctionの一番下、もしくは他の$varsが記述してある部分の一番下あたりに追加してください。
function THEMENAME_preprocess_node(&$vars, $hook) {
// Add article_aside region content.
$vars['article_aside'] = theme('blocks', 'article_aside');
}
3. テーマのnode.tpl.phpのリージョンを表示したい部分に下記のコードを追加。
今回の場合テンプレートの最下部に追加すると良いかと思います。
<?php if ($article_aside && !$teaser): ?>
<div id="article-aside" class="aside">
<?php print $article_aside; ?>
</div>
<?php endif; ?>
Views attachモジュールを使用
上記のリージョンを作成する方法のほうが個人的にはオススメですが、上記のようにファイルを編集するのが億劫な方は、Views attachモジュールを使用するとよいでしょう。選択したコンテントタイプのノードの下にviewを表示させることができます。
設定法
上記の『STEP 8. ブロック表示を追加』の代わりに、下のように設定します。
- Views attachをインストール、有効化してから上記のviewの作成作業に入る。
- 左上のドロップダウンのセレクトリストから"Node content"を選択、[Add display]ボタンをクリック。
- "Node content settings"の"Node types"という項目で、ノード表示中、関連コンテンツを表示したいノードタイプを選択。
- "Show title"にチェックを入れる。
関連コンテンツを選択するベースとなるタームから、特定のボキャブラリに属するものを除く方法
例えば、CocoaSpaceでは現在、ほとんどの記事にDrupal 6.xというタームが付与されています。これを基に関連コンテンツを表示すると、ほとんどすべてのコンテンツがヒットしてしまい、本当に関連性が高い記事だけを表示することができなくなってしまいます。それを避けるには、STEP 4で入力するPHPコードを以下のようにして、Drupalバージョンというボキャブラリ(id=1)に属するタームは無視するようにします。
$node = node_load(arg(1));
if($node->taxonomy) {
foreach($node->taxonomy as $term) {
if($term->vid !== '1' ) {
$terms[] = $term->tid;
}
}
return implode('+', $terms);
}
else {
return;
}
別のスニペット
上記のスニペットでは昔ながらの[php]node_load(arg(1))[/php]というのが使用されていますが、下のように[php]menu_get_object()[/php]を使用する方法もあります。上記のSTEP 4で使用するスニペットと同じことができます。
*menu_get_object()はDrupal 6から導入された関数です。例えばブロックの表示/非表示をPHPコードで制御する場合などにも使えると思います。
スニペットの出典: Related content | groups.drupal.org
// Pick up the node in focus (if any)
$node = menu_get_object();
// Get all the taxonomy terms for this node (if any)
$terms = taxonomy_node_get_terms($node);
// If taxonomy terms were found, return them to the view
if (! empty($terms)) {
return implode('+', array_keys($terms)); // Return all terms found separated by +
}
Drupal 5での設定法
Drupal 5での方法を知りたい方は、英語ですが下のページで紹介されていますのでご参照ください。
Add a 'related nodes' block that links to a taxonomy-based view | drupal.org


コメントを追加