Movable Typeでマルチサイト運用をしている際、「複数のサイトを横断して、特定のコンテンツタイプ(例:お知らせ、会社概要など)をまとめて表示したい」という場面に遭遇することがあります。
しかし、MTの標準タグでは少し工夫が必要になります。今回は、変数とループ処理を組み合わせて、複数サイトから同じ名前のコンテンツデータを取得する方法をご紹介します。
コンテンツデータは複数サイトから「同時取得」ができない?
通常、ブログ記事であれば mt:Entries タグに include_blogs=”all” という属性を付与することで、全サイトの記事を一括で取得できます。
しかし、mt:Contents タグ(コンテンツデータ用)の場合、現時点では site_id(旧 blog_id)に単体のIDしか指定できない仕様のようです。つまり、include_blogs=”all” のような「複数サイトをまたいだ一括取得」が標準ではサポートされていません。
解決策:サイト名を変数に入れてループ処理させる
一括で取得できないのであれば、「対象となるサイトのリストを作成し、そのリスト分だけ処理を繰り返す」というアプローチを取ります。
具体的には以下の手順で実装します。
- 取得したいサイト名をハッシュ変数に格納する
- mt:Loop でサイト名を順番に取り出す
- mt:Blogs タグでサイト名から「サイトID」を特定する
- 特定した「サイトID」を mt:Contents の site_id に渡してデータを取得する
実装コード
実際のテンプレートコードは以下の通りです。
<mt:SetHashVar name="target_sites">
<$mt:SetVar name="サイト名1" value="1"$>
<$mt:SetVar name="サイト名2" value="1"$>
<$mt:SetVar name="サイト名3" value="1"$>
<$mt:SetVar name="サイト名4" value="1"$>
<$mt:SetVar name="サイト名5" value="1"$>
<$mt:SetVar name="サイト名6" value="1"$>
</mt:SetHashVar>
<mt:Loop name="target_sites">
<mt:SetVarBlock name="current_blog_name"><$mt:Var name="__key__"$></mt:SetVarBlock>
<mt:Blogs include_blogs="all">
<mt:If tag="BlogName" eq="$current_blog_name">
<mt:SetVarBlock name="target_site_id"><$mt:BlogID$></mt:SetVarBlock>
<mt:Contents site_id="$target_site_id" content_type="コンテンツタイプ名">
<div class="content-item">
<h2><mt:ContentField content_field="タイトル"><mt:ContentFieldValue></mt:ContentField></h2>
<p><a href="<$mt:ContentPermalink$>">詳細を見る</a></p>
</div>
</mt:Contents>
</mt:If>
</mt:Blogs>
</mt:Loop>
実装のポイントと注意点
サイト名の管理: サイト名をハッシュ変数に入れているため、サイト名が変更されると取得できなくなります。運用に合わせて「サイト名」ではなく「サイトのID」を直接変数に入れてループさせれば、よりよいコードになるかもしれません。
この方法を使えば、標準機能では難しい「複数サイトにまたがる同名コンテンツタイプの取得」が可能になります。
ポータルサイトのような構成で、各子サイトの「私たちについて」や「特定のお知らせ」をトップページに集約したい場合などに、ぜひ活用してみてください。


コメント