カスタムフィールドの型を変える(その5)

テキスト型のカスタムフィールドをドロップダウン型かラジオボタン型に変える場合、ここまでの手順だけだと、カスタムフィールドの選択肢(カスタムフィールドの設定の「オプション」の値)は設定されません。
そこで、カスタムフィールドにすでに入力した値から、オプションを設定する方法を紹介します。

1.注意事項

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

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

2.SQLの実行

まず、これまでの記事を参照して、テキスト型のカスタムフィールドを、ドロップダウン型またはラジオボタン型に変更しておきます。
そして、以下のようなSQLを実行します(ただし、このSQLはMySQL専用です)。
このSQLは、カスタムフィールドに入力されている値を重複なく抜き出し、コンマで区切って、オプションに設定する働きをします。

UPDATE mt_field
SET field_options = (
    SELECT GROUP_CONCAT(DISTINCT ○○○_meta_vchar_idx)
    FROM mt_○○○_meta, mt_○○○
    WHERE ○○○_meta_○○○_id = ○○○_id
    AND ○○○_blog_id = ◇◇◇
    AND ○○○_meta_type = 'field.◎◎◎'
)
WHERE field_basename = '◎◎◎'
AND field_blog_id = ◇◇◇

上記のSQLにある記号は、それぞれ以下に置き換えます。

記号置き換える内容
○○○オブジェクトの型名(記事その3およびその4を参照)
◇◇◇ウェブサイト/ブログのID
◎◎◎カスタムフィールドのベースネーム

ただし、システムのカスタムフィールドの場合は、SQLの最後の行を「AND field_blog_id = 0」に変え、6行目の「AND ○○○_blog_id = ◇◇◇」を削除します。

3.事例

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

  • IDが1番のブログで、ブログ記事に都道府県を入力するために、テキスト型のカスタムフィールドを追加していました。
  • そのカスタムフィールドのベースネームは、「entry_pref」です。
  • テキスト型からドロップダウン型に変えるための作業は、すでに終えています。

この場合、SQLの各記号に当てはめる値は、以下のようになります。

記号置き換える内容置き換える値
○○○オブジェクトの型名entry
◇◇◇ウェブサイト/ブログのID1
◎◎◎カスタムフィールドのベースネームentry_pref

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

UPDATE mt_field
SET field_options = (
    SELECT GROUP_CONCAT(DISTINCT entry_meta_vchar_idx) 
    FROM mt_entry_meta, mt_entry
    WHERE entry_meta_entry_id = entry_id
    AND entry_blog_id = 1
    AND entry_meta_type = 'field.entry_pref'
)
WHERE field_basename = 'entry_pref'
AND field_blog_id = 1