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

カスタムフィールドを作ってデータを入力した後で、型を変えたい場面が出ることがあります(例:テキスト→ドロップダウン)。
しかし、Movable Typeの標準機能では、カスタムフィールドを一度作成すると、後で型を変えることができません。

そこで、データベースを直接に書き換えて、カスタムフィールドの型を変える方法を紹介します。
今日は、前提となる知識として、カスタムフィールドのデータベースの構造を解説します。

1.mt_fieldテーブル

個々のカスタムフィールドの定義は、「mt_field」というテーブルに保存されます。
このテーブルには、以下の列があります。

列名内容
field_idID
field_basenameベースネーム
field_blog_idカスタムフィールドが属するブログ/ウェブサイトのID
システムのカスタムフィールドでは0
field_description説明
field_name名前
field_obj_typeカスタムフィールドを追加するオブジェクトの種類(entry、category、blogなど)
field_optionsオプション
field_required入力必須のカスタムフィールドでは1、そうでなければ0
field_tagテンプレートタグ名
field_typeカスタムフィールドのタイプ

field_type列の値は、カスタムフィールドのタイプに応じて、以下の表のようになります。
フィールドのタイプを変える際に、この情報を使います。

タイプ
テキストtext
テキスト(複数行)textarea
チェックボックスcheckbox
URLurl
日付と時刻datetime
ドロップダウンselect
ラジオボタンradio
埋め込みオブジェクトembed
アイテムfile
オーディオaudio
ビデオvideo
画像image

2.○○○_metaテーブル

カスタムフィールドのデータは、元のデータのテーブル名に「_meta」を付けた名前のテーブルに保存されます。
例えば、ブログ記事のテーブル名は「mt_entry」ですので、ブログ記事のカスタムフィールドのデータは、「mt_entry_meta」テーブルに保存されます。

個々のカスタムフィールドは、1つのカスタムフィールドにつき、1つのレコードとして、データベースに保存されています。
metaテーブルには、「○○○_meta_type」という列があり、その値が「field.ベースネーム」のような値になります(○○○は、「entry」など、オブジェクトの名前)。
「○○○_meta_○○○_id」の列には、カスタムフィールドを付けたオブジェクトのIDが保存されます。
また、「○○○_meta_vchar」「○○○_meta_vdatetime」など、データの型に応じた列があり、適切な列にデータが保存されるようになっています。

例えば、ブログ記事にテキストのカスタムフィールドを追加し、ベースネームを「entry_text」にしたとします。
そして、IDが1番/2番/3番のブログ記事で、このカスタムフィールドに以下のように値を設定したとします。

ID
1東京
2大阪
3名古屋

テキストのデータは、metaテーブルの「○○○_vchar_idx」の列に保存されます。
ブログ記事にカスタムフィールドを追加した場合だと、mt_entry_metaテーブルに、以下のようなレコードができます。

entry_meta_entry_identry_meta_typeentry_meta_vchar_idx
1field.entry_text東京
2field.entry_text大阪
3field.entry_text名古屋

なお、カスタムフィールドのタイプと、そのデータが保存される列の関係は、以下の表のようになっています。
フィールドのタイプを変える際に、この情報を使います。

タイプ保存先の列名
テキストvchar_idx
テキスト(複数行)vclob
チェックボックスvinteger_idx
URLvchar
日付と時刻vdatetime_idx
ドロップダウンvchar_idx
ラジオボタンvchar_idx
埋め込みオブジェクトvclob
アイテムvclob
オーディオvclob
ビデオvclob
画像vclob