0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MTで、ウェブページ一覧のバリエーション(例外編)

0
Posted at

コンテンツフィールド

基本形①:tag="ContentFieldValue" をそのまま使う

例:カスタムフィールド「表示フラグ」が「非表示」のものを 除外 したい

<mt:Contents content_type="コンテンツタイプ名">
  <!-- 表示フラグが「非表示」ではないときだけ出力 -->
  <mt:Unless tag="ContentFieldValue" field="表示フラグ" eq="非表示">
    <div class="item">
      <h3><mt:ContentLabel></h3>
      <p>表示フラグ:<mt:ContentFieldValue field="表示フラグ"></p>
    </div>
  </mt:Unless>
</mt:Contents>
  • tag="ContentFieldValue" field="表示フラグ"
    → 現在ループ中のコンテンツの「表示フラグ」フィールドの値を条件に使う
  • eq="非表示"<mt:Unless> に書いているので
    値が「非表示」でないものだけ 中身が出力される = 「非表示」のデータは一覧から除外される

基本形②:いったん変数に入れてから name="" で判定

複数回使いたい時や、ちょっと加工してから条件に使いたい時はこうします。

例:フィールド「料金」が空のものを除外(空じゃないものだけ出す)

<mt:Contents content_type="コンテンツタイプ名">
  <!-- まず料金フィールドを変数に入れる -->
  <mt:SetVarBlock name="price">
    <mt:ContentFieldValue field="料金">
  </mt:SetVarBlock>

  <!-- price が空と等しくないとき(= 何か入っているとき)だけ表示 -->
  <mt:Unless name="price" eq="">
    <div class="item">
      <h3><mt:ContentLabel></h3>
      <p>料金:<mt:Var name="price" numify="1">円</p>
    </div>
  </mt:Unless>
</mt:Contents>

ポイント:

  • SetVarBlockprice という変数に値を入れる
  • <mt:Unless name="price" eq="">
    price が空文字と等しくない(≠ "")ときに中身を出す
    → 結果的に「料金が空のデータは一覧から除外」

よく使うパターンのまとめ

1. フィールドが空じゃないものだけ出したい

<mt:Unless tag="ContentFieldValue" field="料金" eq="">
  <!-- 料金が入っているコンテンツだけ表示 -->
</mt:Unless>

2. フィールドが特定の値のときだけ除外したい

<mt:Unless tag="ContentFieldValue" field="ステータス" eq="非公開">
  <!-- ステータスが「非公開」以外のデータだけ表示 -->
</mt:Unless>

3. フラグフィールドで「1 のものだけ除外」したい

<mt:SetVarBlock name="hide_flag">
  <mt:ContentFieldValue field="非表示フラグ">
</mt:SetVarBlock>

<mt:Unless name="hide_flag" eq="1">
  <!-- 非表示フラグが 1 ではないデータだけ表示 -->
</mt:Unless>

ざっくり整理すると

  • ContentFieldValue を直接条件に使うとき

    • tag="ContentFieldValue" field="フィールド名" ...
  • 一度変数に入れてから使うとき

    • <mt:SetVarBlock name="xxx"><mt:ContentFieldValue field="フィールド名"></mt:SetVarBlock>
    • その後 <mt:Unless name="xxx" eq="...">

どちらも正解で、「処理を使い回すかどうか」で選ぶ感じです。


ページ一覧

「ウェブページ一覧をフォルダ別に出す」書き方は、ざっくりこの3パターンを押さえておけばOKです。


パターンA:「今いるフォルダ」のページ一覧

  • フォルダアーカイブテンプレート
  • または「ページ個別テンプレート」で「同じフォルダの兄弟ページ一覧」を出したいとき
<mt:PageFolder>  <!-- 今のページが属するフォルダにコンテキストを切り替え -->
  <h2><mt:FolderLabel></h2>

  <ul>
    <mt:Pages sort_by="authored_on" sort_order="asc">
      <li>
        <a href="<mt:PagePermalink>"><mt:PageTitle></a>
      </li>
    </mt:Pages>
  </ul>
</mt:PageFolder>
  • <mt:PageFolder> の中で <mt:Pages> を回すと、
    そのフォルダ配下のウェブページ一覧になります。
  • 「今のページと同じフォルダのページ一覧」を出したい時に定番です。

※ここに前の話の <mt:Unless> / <mt:If> を入れると
「同じフォルダの中で、自分自身だけ除外」「特定IDだけ除外」などもできます。


パターンB:特定フォルダ名を指定して一覧

「このテンプレートで、フォルダAのページだけ一覧にしたい」という場合。

<mt:Pages folder="フォルダ名" sort_by="authored_on" sort_order="asc">
  <li>
    <a href="<mt:PagePermalink>"><mt:PageTitle></a>
  </li>
</mt:Pages>
  • folder="フォルダ名" で、特定フォルダに属するページのみを対象にできます。
  • サブフォルダもまとめて取りたい場合は、include_subfolders="1" を付けます:
<mt:Pages folder="お知らせ" include_subfolders="1" sort_by="authored_on" sort_order="asc">
  ...
</mt:Pages>

パターンC:フォルダごとにまとめて一覧(グルーピング)

「フォルダ見出し → そのフォルダのページ一覧」という構造を
上から順にずらっと出したいとき。

<mt:TopLevelFolders>   <!-- まず最上位フォルダを1つずつ -->
  <h2><mt:FolderLabel></h2>

  <ul>
    <mt:Pages include_subfolders="1" sort_by="authored_on" sort_order="asc">
      <li>
        <a href="<mt:PagePermalink>"><mt:PageTitle></a>
      </li>
    </mt:Pages>
  </ul>

  <!-- 必要ならサブフォルダもネスト -->
  <mt:SubFolders>
    <h3><mt:FolderLabel></h3>
    <ul>
      <mt:Pages include_subfolders="1" sort_by="authored_on" sort_order="asc">
        <li><a href="<mt:PagePermalink>"><mt:PageTitle></a></li>
      </mt:Pages>
    </ul>
  </mt:SubFolders>

</mt:TopLevelFolders>
  • フォルダ単位でページをまとめて表示したい「サイトマップ」的なページに向いてます。

「フォルダ別+特定データ除外」を組み合わせる例

例えば、

「同じフォルダのページ一覧を出したいが、
今のページだけは除外したい」

なら、パターンAに <mt:Unless> を足してこうなります👇

<mt:SetVarBlock name="current_page_id"><mt:PageID></mt:SetVarBlock>

<mt:PageFolder>
  <h2><mt:FolderLabel></h2>
  <ul>
    <mt:Pages sort_by="authored_on" sort_order="asc">
      <mt:Unless tag="PageID" eq="$current_page_id">
        <li>
          <a href="<mt:PagePermalink>"><mt:PageTitle></a>
        </li>
      </mt:Unless>
    </mt:Pages>
  </ul>
</mt:PageFolder>

「今いるフォルダ」の子フォルダー内ページ一覧

いいテーマです!
今いるフォルダの “子フォルダ内” ページ一覧」なら、基本は

今いるフォルダ → <mt:PageFolder>
その子フォルダ → <mt:SubFolders>
子フォルダのページ → <mt:Pages>

という三段構成で書きます 👍


① 子フォルダごとに見出し+ページ一覧(いちばん素直な形)

  • 今のページが入っているフォルダを「親フォルダ」として、
  • その 子フォルダごと にページ一覧を出すパターンです。
<mt:PageFolder>  <!-- 今いるページのフォルダにコンテキストを切り替え -->

  <!-- このフォルダの「直下の子フォルダ」を1つずつ -->
  <mt:SubFolders>
    <h3><mt:FolderLabel></h3>

    <ul>
      <!-- その子フォルダに属するウェブページ一覧 -->
      <mt:Pages sort_by="authored_on" sort_order="asc">
        <li>
          <a href="<mt:PagePermalink>"><mt:PageTitle></a>
        </li>
      </mt:Pages>
    </ul>

  </mt:SubFolders>

</mt:PageFolder>
  • 使う場所の例

    • ウェブページ個別テンプレート(about/index.html など)
    • フォルダアーカイブテンプレート
  • 出力イメージ

[親フォルダ]
  ├─ 子フォルダA
  │    ├─ ページA-1
  │    └─ ページA-2
  └─ 子フォルダB
       └─ ページB-1

という感じで、

  • 「子フォルダ名(<mt:FolderLabel>)」を見出しにして
  • その配下のウェブページを <mt:Pages> で一覧

になります。


② 子フォルダ内のページだけを“フラット”に一覧

フォルダ名の見出しはいらない、
「今いるフォルダの子フォルダにあるページだけを、全部まとめてリスト」
という形にしたい場合は、見出しを外してこんな書き方もできます。

<mt:PageFolder>

  <ul>
    <!-- 子フォルダを順番にまわしながら、その中のページを全部出していく -->
    <mt:SubFolders>
      <mt:Pages sort_by="authored_on" sort_order="asc">
        <li>
          <a href="<mt:PagePermalink>"><mt:PageTitle></a>
        </li>
      </mt:Pages>
    </mt:SubFolders>
  </ul>

</mt:PageFolder>
  • 表示上はフォルダ見出しを出していないだけで、
    ロジックとしては「子フォルダ → そのページ」を全部つなげて出しています。
  • 同じ親フォルダ配下のすべての子フォルダに入っているページが並びます。

③ 親フォルダ自身のページは含めず、「子フォルダだけ」のポイント

上の2パターンはどちらも、

  • 親フォルダ:<mt:PageFolder>
  • 子フォルダ:<mt:SubFolders> の中の <mt:Pages>

という形になっているので、

親フォルダ直下のページはそもそも Pages の対象になっていない
(子フォルダ内ページだけが対象)

という動きになっています。
「親フォルダ直下のページも一緒に出したい」なら、逆に <mt:Pages><mt:PageFolder> 直下にも書き足す感じです。


このあと「特定ページだけ除外」も組み合わせられる

さっきまで話していた Unless ももちろん組み合わせられます。

例:
「今見ているページと同じ子フォルダ内のページ一覧を出したいが、自分自身は除外したい」なども、

<mt:SetVarBlock name="current_page_id"><mt:PageID></mt:SetVarBlock>

<mt:PageFolder>
  <mt:SubFolders>
    <h3><mt:FolderLabel></h3>
    <ul>
      <mt:Pages sort_by="authored_on" sort_order="asc">
        <mt:Unless tag="PageID" eq="$current_page_id">
          <li><a href="<mt:PagePermalink>"><mt:PageTitle></a></li>
        </mt:Unless>
      </mt:Pages>
    </ul>
  </mt:SubFolders>
</mt:PageFolder>

みたいに書けます。


今いるものだけ除外」は、ページでもコンテンツデータでも 基本パターンは同じ です。

  1. まず「今いるID」を変数に入れる
  2. 一覧ループの中で、そのIDと一致したら出力しない

これをそれぞれ

  • ウェブページ一覧(<mt:Pages>
  • コンテンツデータ一覧(<mt:Contents>

で書いてみます。


① ウェブページ一覧で「今いるページだけ除外」

A. 同じフォルダ内の他ページ一覧(兄弟ページ)から除外する例

想定:
ウェブページ個別テンプレート(ウェブページのアーカイブテンプレート)で
「同じフォルダ内の他のページ一覧」を出したいが、
今見ているページだけは出したくない 場合。

<mt:SetVarBlock name="current_page_id"><mt:PageID></mt:SetVarBlock>

<mt:PageFolder>  <!-- 今のページが属しているフォルダ -->
  <h2><mt:FolderLabel></h2>

  <ul>
    <mt:Pages sort_by="authored_on" sort_order="asc">
      <!-- 今いるページ(current_page_id)と同じIDなら表示しない -->
      <mt:Unless tag="PageID" eq="$current_page_id">
        <li>
          <a href="<mt:PagePermalink>"><mt:PageTitle></a>
        </li>
      </mt:Unless>
    </mt:Pages>
  </ul>
</mt:PageFolder>

ポイント:

  • PageID … 今ループ中のページのID
  • current_page_id … 今開いているページのID(最初に変数に保存)
  • <mt:Unless tag="PageID" eq="$current_page_id">
    「IDが同じなら出さない」=今いるページだけ一覧から除外 になります。

同じことを If で書くとこうなります:

<mt:If tag="PageID" ne="$current_page_id">
  ...表示部分...
</mt:If>

中身は同じで、好みの問題です。


B. 「今いるフォルダ」の子フォルダ内ページ一覧から除外する例

さっき話していた「今いるフォルダの子フォルダ内ページ一覧」に
“今いるページだけ除外” を足したバージョンです。

<mt:SetVarBlock name="current_page_id"><mt:PageID></mt:SetVarBlock>

<mt:PageFolder>
  <mt:SubFolders>
    <h3><mt:FolderLabel></h3>
    <ul>
      <mt:Pages sort_by="authored_on" sort_order="asc">
        <mt:Unless tag="PageID" eq="$current_page_id">
          <li>
            <a href="<mt:PagePermalink>"><mt:PageTitle></a>
          </li>
        </mt:Unless>
      </mt:Pages>
    </ul>
  </mt:SubFolders>
</mt:PageFolder>

② コンテンツタイプアーカイブで「今いるコンテンツデータだけ除外」

想定:
コンテンツタイプアーカイブテンプレート(コンテンツデータ個別)で

  • 「同じコンテンツタイプの他のデータ一覧(関連記事)」を出したい
  • でも 今見ているコンテンツデータは除外 したい

というパターン。

<mt:SetVarBlock name="current_cd_id"><mt:ContentID></mt:SetVarBlock>

<h2>同じコンテンツタイプの他のデータ</h2>
<ul>
  <mt:Contents
      content_type="コンテンツタイプ名"
      sort_by="content_field"
      sort_order="asc">
      
    <!-- 今いるコンテンツデータとIDが同じなら表示しない -->
    <mt:Unless tag="ContentID" eq="$current_cd_id">
      <li>
        <a href="<mt:ContentPermalink>"><mt:ContentLabel></a>
      </li>
    </mt:Unless>

  </mt:Contents>
</ul>

これで、

  • コンテンツタイプ「コンテンツタイプ名」の一覧を出しつつ
  • 今表示しているコンテンツ(ContentIDcurrent_cd_id と同じ)はスキップ

という動きになります。

Ifで書く場合はこう:

<mt:If tag="ContentID" ne="$current_cd_id">
  ...表示...
</mt:If>

③ さらに条件を足したいときのヒント

例えば:

  • 同じカテゴリ(分類セット)に属しているデータだけに絞る
  • 特定のカスタムフィールドが空じゃないものだけ表示
  • 「自分以外+公開日が未来じゃないものだけ」など

も同じパターンで組み合わせられます。

例:
「自分以外、かつ フィールド公開フラグ1 のデータだけ」

<mt:SetVarBlock name="current_cd_id"><mt:ContentID></mt:SetVarBlock>

<mt:Contents content_type="コンテンツタイプ名">
  <!-- まず公開フラグを変数に -->
  <mt:SetVarBlock name="publish_flag">
    <mt:ContentFieldValue field="公開フラグ">
  </mt:SetVarBlock>

  <mt:If tag="ContentID" ne="$current_cd_id" and name="publish_flag" eq="1">
    ...表示...
  </mt:If>
</mt:Contents>

まとめ(覚え方)

  • ページ版

    • PageIDcurrent_page_id に保存
    • <mt:Pages> の中で ID == current_page_id をスキップ
  • コンテンツデータ版

    • ContentIDcurrent_cd_id に保存
    • <mt:Contents> の中で ID == current_cd_id をスキップ

という 同じパターン です。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?