サイト制作に関するメモ書き

HOME > CMS > Movable Type > コンテンツタイプの詳細ページで前後の記事を表示する

コンテンツタイプの詳細ページで前後の記事を表示する

Movable Typeの記事詳細ページで前後の記事リンクを表示する方法は以前投稿しましたが、コンテンツタイプの詳細ページで同じことをしようとして少し迷ったので、実装方法をメモしておきます。

サンプルコード

まずはうまくいかなかった例です。
以前投稿したブログで前後の記事を表示する方法で試してみました。

<ul class="page-navigation-list">
  <mt:EntryPrevious>
    <li class="prev">
      <a href="<mt:EntryPermalink>"><mt:EntryTitle></a>
    </li>
  </mt:EntryPrevious>
  <mt:EntryNext>
    <li class="next">
      <a href="<mt:EntryPermalink>"><mt:EntryTitle></a>
    </li>
  </mt:EntryNext>
</ul>

これで再構築を行うと以下のようなエラーになりました。

日付アーカイブ「ContentType」の再構築中にエラーが発生しました: テンプレート「XXXXX」の再構築中にエラーが発生しました: タグでエラーがありました: mtEntryPreviousをコンテキスト外で利用しようとしています。MTEntriesコンテナタグの外部で使っていませんか?

mtEntryPreviousやmtEntryNextが、MTEntries内でしか使用できないためのようです。

MTタグで用意されていないか探してみたのですがなさそうだったので、自前で実装してみます。
試行錯誤した結果、最終的に以下のようになりました。

<mt:Ignore><!-- 現在のページのデータ識別ラベルを取得 --></mt:Ignore>
<mt:SetVarBlock name="dataLabel"><mt:ContentLabel></mt:SetVarBlock>

<ul class="page-navigation-list">
  <mt:Ignore><!-- 前のページかどうかを判別する変数 --></mt:Ignore>
  <mt:SetVar name="prevUrlFlag" value="false">
  <mt:Contents content_type="【コンテンツタイプ 名】">
    <mt:Ignore><!-- 前のページの場合 --></mt:Ignore>
    <mt:If name="prevUrlFlag" eq="true">
      <li class="prev">
        <a href="<mt:ContentPermalink>"><mt:ContentLabel>(前のページ)</a>
      </li>
      <mt:Ignore><!-- 判別用の変数を元に戻す --></mt:Ignore>
      <mt:SetVar name="prevUrlFlag" value="false">
    </mt:If>

    <mt:Ignore><!-- 現在のページかどうか --></mt:Ignore>
    <mt:If tag="ContentLabel" eq="$dataLabel">
      <mt:SetVar name="prevUrlFlag" value="true">
    </mt:If>
  </mt:Contents>

  <mt:Ignore><!-- 次のページかどうかを判別する変数 --></mt:Ignore>
  <mt:SetVar name="nextUrlFlag" value="false">
  <mt:Contents content_type="【コンテンツタイプ 名】" sort_order="ascend">
    <mt:Ignore><!-- 次のページの場合 --></mt:Ignore>
    <mt:If name="nextUrlFlag" eq="true">
      <li class="next">
        <a href="<mt:ContentPermalink>"><mt:ContentLabel>(次のページ)</a>
      </li>
      <mt:Ignore><!-- 判別用の変数を元に戻す --></mt:Ignore>
      <mt:SetVar name="nextUrlFlag" value="false">
    </mt:If>

    <mt:Ignore><!-- 現在のページかどうか --></mt:Ignore>
    <mt:If tag="ContentLabel" eq="$dataLabel">
      <mt:SetVar name="nextUrlFlag" value="true">
    </mt:If>
  </mt:Contents>
</ul>

大まかな流れとしては、(1)現在のページのデータ識別ラベルを取得(1〜2行目) (2)mtContentsでデータ識別ラベルの一致するコンテンツデータを探す(17〜20行目) (3)一致した次のコンテンツデータが前の記事になるので、リンクを出力する(8〜15行目) のようになります。
次の記事の場合はmtContentsにsort_order=”ascend”を設定して並び順を逆にして、同様の処理を行っています。
 

【参考サイト】

 

コメントを残す

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

▲PAGE TOP