Movable Typeを使っていてたまにあるのですが、サイト公開後にカスタムフィールドを追加する際、既存記事を全て上書きしないといけなくなることがあるので、いくつか試してみました。
サンプルコード
まずはカスタムフィールド 追加前の状態です。
「記事A」「記事B」というブログ記事を投稿し、テンプレートは以下のようになっています。
<ul> <mt:Entries> <li><$mt:EntryTitle$></li> </mt:Entries> </ul>
出力後は以下のようになっています。
<ul> <li>記事B</li> <li>記事A</li> </ul>
この状態で、以下のカスタムフィールドを追加してみます。
- 種類:テキスト
- 既定値:これは初期値です。
- ベースネーム:addtext
- テンプレートタグ:EntryAddText
今追加したカスタムフィールドが表示されるように、テンプレートを以下のように変更します。
<ul> <mt:Entries> <li><$mt:EntryTitle$>(text:<mt:EntryAddText>)</li> </mt:Entries> </ul>
テンプレート変更後、記事Cを新しく登録します。
その際、カスタムフィールドの値は変更しないでおきます。
登録後に表示を確認すると、以下のようになりました。
<ul> <li>記事C(text:これは初期値です。)</li> <li>記事B(text:)</li> <li>記事A(text:)</li> </ul>
記事Cのみカスタムフィールドの値が表示され、記事と記事Bは表示されません。
これはカスタムフィールドを追加した際に既存記事にそのデータが入っていないからです。
試しに記事Aを空更新(何も変更しないで更新のみ実行)してみます。
表示を確認すると記事Aにもカスタムフィールドの値が表示されました。
<ul> <li>記事C(text:これは初期値です。)</li> <li>記事B(text:)</li> <li>記事A(text:これは初期値です。)</li> </ul>
このようにカスタムフィールドに初期値を設定した場合でも、既存記事にカスタムフィールドの値を表示したい場合、全記事更新し直す必要があります。
先ほどはテキストのカスタムフィールドを追加しましたが、次はチェックボックスのカスタムフィールド を追加してみます。
以下の内容で追加します。
- 種類:チェックボックス
- 既定値:チェックを入れた状態
- ベースネーム:addcheck
- テンプレートタグ:EntryAddCheck
カスタムフィールド を確認できるように、テンプレートを変更します。
<ul> <mt:Entries> <li><$mt:EntryTitle$>(text:<mt:EntryAddText>, check:<mt:EntryAddCheck>)</li> </mt:Entries> </ul>
新しく記事Dを登録します。
カスタムフィールドのチェックは入ったままにします。
登録後に表示確認すると、以下のように表示されました。
<ul> <li>記事D(text:これは初期値です。, check:1)</li> <li>記事C(text:これは初期値です。, check:)</li> <li>記事B(text:, check:)</li> <li>記事A(text:これは初期値です。, check:)</li> </ul>
テキストの場合と同様で、カスタムフィールド後に記事追加した記事Dのみチェック(1)が表示され、それ以外の記事は表示されませんでした。
記事Aを空更新すると、以下のように記事Aもチェックが表示されました。
<ul> <li>記事D(text:これは初期値です。, check:1)</li> <li>記事C(text:これは初期値です。, check:)</li> <li>記事B(text:, check:)</li> <li>記事A(text:これは初期値です。, check:1)</li> </ul>
記事Cでカスタムフィールドのチェックを外して更新してみます。
<ul> <li>記事D(text:これは初期値です。, check:1)</li> <li>記事C(text:これは初期値です。, check:0)</li> <li>記事B(text:, check:)</li> <li>記事A(text:これは初期値です。, check:1)</li> </ul>
記事Cがチェックされてない状態(0)で表示されました。
チェックボックスがチェックされているかどうかは、if文を使って以下のように判定できます。
<mt:If tag="テンプレートタグ名"> // チェックされている場合 <mt:Else> // チェックされていない場合 or データが入っていない場合 </mt:If>
先ほどの例に追加すると以下のようになります。
<ul> <mt:Entries> <li><$mt:EntryTitle$>(text:<mt:EntryAddText>, check:<mt:If tag="EntryAddCheck"><mt:EntryAddCheck><mt:Else>ないです</mt:If>)</li> </mt:Entries> </ul>
再構築を行うと、チェックを入れた状態で投稿/更新し直した記事Aと記事Dにはチェックが、チェックを外して更新/更新していない記事Bと記事CはMTElseの判定に入れることができました。
<ul> <li>記事D(text:これは初期値です。, check:1)</li> <li>記事C(text:これは初期値です。, check:ないです)</li> <li>記事B(text:, check:ないです)</li> <li>記事A(text:これは初期値です。, check:1)</li> </ul>
次にカスタムフィールドの値で記事の絞り込みを試してみます。
以下のように設定してみます。
<ul> <mt:Entries field:addcheck="0"> <li><$mt:EntryTitle$>(text:<mt:EntryAddText>, check:<mt:If tag="EntryAddCheck"><mt:EntryAddCheck><mt:Else>ないです</mt:If>)</li> </mt:Entries> </ul>
これで記事Bと記事Cに絞り込まれないかなと思ったのですが、記事Cのみに絞り込まれました。
0はデータ未登録に含まないようです。
<ul> <li>記事C(text:これは初期値です。, check:ないです)</li> </ul>
値を空にしてみます。
<ul> <mt:Entries field:addcheck=""> <li><$mt:EntryTitle$>(text:<mt:EntryAddText>, check:<mt:If tag="EntryAddCheck"><mt:EntryAddCheck><mt:Else>ないです</mt:If>)</li> </mt:Entries> </ul>
この場合も結果は同じでした。
空の場合でもデータ未登録は含まれないようです。
<ul> <li>記事C(text:これは初期値です。, check:ないです)</li> </ul>
このようにサイト公開後にカスタムフィールドを追加する場合、追加内容によっては過去に投稿した記事を更新しないといけなくなる場合があるので注意が必要です。
コメントが承認されるまで時間がかかります。