ドロップダウン型/ラジオボタン型カスタムフィールドの選択肢の値の変更

先週は、カスタムフィールドの型を変えることについて記事を書きました。
その関連で、ドロップダウン型/ラジオボタン型のカスタムフィールドを作った後で、選択肢の値を変える方法を紹介します。

1.注意事項

この記事で取り上げる方法では、データベースを直接に操作します。
操作を間違うと、Movable Typeのデータ(特にカスタムフィールドのデータ)が壊れることもあり得ます。

データベースを操作する前に、データを必ずバックアップしておいてください。
また、バックアップしたデータを正しく復元できることも確認しておいてください。
操作ミスでデータが壊れたとしても、当方は責任を負いません。

2.問題点

ドロップダウン型/ラジオボタン型カスタムフィールドを作って、ブログ記事等にデータを入力した後で、そのカスタムフィールドの選択肢の値を変えることができます。
ただ、すでに入力済みのブログ記事等では、カスタムフィールドのデータは変更されず、選択肢とは異なる値になってしまいます。

例えば、カスタムフィールドの選択肢として「東京都,神奈川県,埼玉県,千葉県」を設定して、ブログ記事等を入力し、カスタムフィールドの値も設定したとします。
この状態で、カスタムフィールドの選択肢を「東京,神奈川,埼玉,千葉」に変更するとします。
すると、すでにデータを入力してあるブログ記事等では、カスタムフィールドの値は「東京都」等のままで、変更後の選択肢の値と異なります。
そのため、ブログ記事等を編集しなおすと、カスタムフィールドの値が規定値に変わってしまうという現象が起こります。

3.SQLで修正

上で述べたように、カスタムフィールドの選択肢を修正した場合は、それに応じてブログ記事等のカスタムフィールドの値も修正する必要があります。
それぞれの選択肢の値に対して、以下のようなSQLを順次実行していくことで、カスタムフィールドの値を一度に修正することができます。

UPDATE mt_○○○_meta, mt_○○○
SET ○○○_meta_vchar_idx = '△△△'
WHERE ○○○_id = ○○○_meta_○○○_id
AND ○○○_blog_id = ◇◇◇
AND ○○○_meta_type = 'field.◎◎◎'
AND ○○○_meta_vchar_idx = '▽▽▽'
記号置き換える内容
○○○オブジェクトの型名
△△△変更後の選択肢の値
▽▽▽変更前の選択肢の値
◇◇◇ウェブサイト/ブログのID
◎◎◎カスタムフィールドのベースネーム

ただし、システムのカスタムフィールドの場合は、SQLの4行目の「AND ○○○_blog_id = ◇◇◇」を削除します。

3.事例

以下のような場合を考えます。

  • IDが1番のブログで、ブログ記事に都道府県を入力するために、テキスト型のカスタムフィールドを追加していました。
  • そのカスタムフィールドのベースネームは、「entry_pref」です。
  • 変更前の選択肢は、「東京都,神奈川県,埼玉県,千葉県」でした。
  • 選択肢を「東京,神奈川,埼玉,千葉」に変更します。

まず、「東京都」を「東京」に変えるためのSQLを実行します。
この場合、SQLの各記号に当てはめる値は、以下のようになります。

記号置き換える内容置き換える値
○○○オブジェクトの型名entry
△△△変更後の選択肢の値東京
▽▽▽変更前の選択肢の値東京都
◇◇◇ウェブサイト/ブログのID1
◎◎◎カスタムフィールドのベースネームentry_pref

したがって、以下のSQLを実行します。

UPDATE mt_entry_meta, mt_entry
SET entry_meta_vchar_idx = '東京'
WHERE entry_id = entry_meta_entry_id
AND entry_blog_id = 1
AND entry_meta_type = 'field.entry_pref'
AND entry_meta_vchar_idx = '東京都'

同様の手順で、神奈川県/埼玉県/千葉県を、それぞれ神奈川/埼玉/千葉に変えるためのSQLを順に実行します。