拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
ドロップダウン型/ラジオボタン型カスタムフィールドの選択肢の値の変更
先週は、カスタムフィールドの型を変えることについて記事を書きました。
その関連で、ドロップダウン型/ラジオボタン型のカスタムフィールドを作った後で、選択肢の値を変える方法を紹介します。
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 |
△△△ | 変更後の選択肢の値 | 東京 |
▽▽▽ | 変更前の選択肢の値 | 東京都 |
◇◇◇ | ウェブサイト/ブログのID | 1 |
◎◎◎ | カスタムフィールドのベースネーム | 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を順に実行します。