Movable Typeで複数サイトから特定のコンテンツデータを一括取得する方法

MovableType

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」を直接変数に入れてループさせれば、よりよいコードになるかもしれません。

この方法を使えば、標準機能では難しい「複数サイトにまたがる同名コンテンツタイプの取得」が可能になります。

ポータルサイトのような構成で、各子サイトの「私たちについて」や「特定のお知らせ」をトップページに集約したい場合などに、ぜひ活用してみてください。

コメント

タイトルとURLをコピーしました