「WordPressで学ぶPHP(1)変数・制御構造編」が発売されました。
「WordPressで学ぶPHP」シリーズの第1巻で、WordPressを通してPHPを学んでいく本です。
この本では、PHPの基本となる変数と制御構造について解説します。
Kindle本で、定価500円です。
数値型のカスタムフィールドを追加するプラグイン(その2)
昨日に続いて、数値型のカスタムフィールドを追加するプラグインについてお話しします。
今日は、既存のテキスト型のデータを数値型に変換する方法を解説します。
1.データのバックアップ
テキストから数値への変換は、phpMyAdmin等を使って、SQLを直接に実行する形で行います。
多くのデータが影響を受けますので、万が一の事態に備えて、ブログのデータを必ずバックアップしておいてください。
また、バックアップから正しく復元できることも、確認しておいてください。
2.SQLに必要な情報のチェック
SQLを実行する前に、以下の4つの情報をメモしておいてください。
- ブログのID
- 変換元のテキスト型フィールドのベースネーム
- 変換先の数値型フィールドのベースネーム
- 変換先の数値型フィールドの数値の型(整数/浮動小数点数)
3.SQLの実行
次に、phpMyAdmin等を使って、SQLを実行します。
まず以下のようなSQLを実行します。
delete mt_entry_meta.* from mt_entry_meta, mt_entry, mt_blog where entry_meta_entry_id = entry_id and entry_blog_id = blog_id and blog_id = ブログのID and entry_meta_type = 'field.変換先の数値型フィールドのベースネーム'
次に、以下のSQLを実行します。
「数値の型」のところには、整数型なら「vinteger」、浮動小数点型なら「vfloat」を入れます。
update mt_entry_meta, mt_entry, mt_blog set entry_meta_type = 'field.変換先の数値型フィールドのベースネーム', entry_meta_数値の型_idx = entry_meta_vchar_idx, entry_meta_vchar_idx = null where entry_meta_entry_id = entry_id and entry_blog_id = blog_id and blog_id = ブログのID and entry_meta_type = 'field.変換元のテキスト型フィールドのベースネーム'
例えば、以下のような変換を行いたいとします。
項目 | 値 |
---|---|
ブログのID | 1 |
変換元のテキスト型フィールドのベースネーム | text1 |
変換先の数値型フィールドのベースネーム | number1 |
変換先の数値型フィールドの数値の型 | 整数(vinteger) |
この場合、以下の順でSQLを実行します。
delete mt_entry_meta.* from mt_entry_meta, mt_entry, mt_blog where entry_meta_entry_id = entry_id and entry_blog_id = blog_id and blog_id = 1 and entry_meta_type = 'field.number1'
update mt_entry_meta, mt_entry, mt_blog set entry_meta_type = 'field.number1', entry_meta_vinteger_idx = entry_meta_vchar_idx, entry_meta_vchar_idx = null where entry_meta_entry_id = entry_id and entry_blog_id = blog_id and blog_id = 1 and entry_meta_type = 'field.text1'
4.ベースネーム/テンプレートタグ名の変更
次に、変換元のテキスト型のフィールドを削除します。
そして、変換先の数値型のフィールドで、ベースネームとテンプレートタグ名を、変換元のテキスト型のベースネーム/テンプレートタグ名に変更します。
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください
あぬあぬ
今、MTに藤本様著作のMTOS活用テクニックを用いて、数値検索の設置で格闘中なのですが、どうにもこうにもうまくいきません。
現在は、上記の本を見ながら自作のカスタムフィールドを作り管理画面に設置できたものの、数値を入れて保存をしても数値が入らない状況で、なんともかんとも、先に進みません。
edit_entry.htmlには以下の記述を入れました。
プラグインファイルは以下のように記述しました。
どこか、間違いはありますでしょうか?
壱
>あぬあぬさん
こんにちは。
拙著をお買い求めいただき、ありがとうございます。
ご質問の件ですが、edit_entry.tmplに追加している部分に間違いがあります。
フィールド名等に「entry_price_01」とありますが、それらの「entry_」を削除して、以下のようにしてください。
あぬあぬ
早速のお返事ありがとうございます。
お蔭様で、数値を保存することが出来ました。
がしかし、今度は別の問題が起きました。
○○以下の数値検索を行ってみたのですが、結果が「以下」になりません。
サーチフォームは以下です。
検索結果表示のモジュールは以下です。
必要なプラグイン類は入っているのですが、いろいろと試してみましたが、うまく動作しません。
お手数ですが、記述のチェックをお願いできればと思います。
壱からあぬあぬへの返信
>あぬあぬさん
こんにちは。
ご質問の件ですが、MTSearchConditionCompareタグの「le」モディファイアの最後の「_max」が間違いです。
以下のように変えてください。
あぬあぬ
上記の内容に変更してみましたが、今度は結果に何も表示されなくなってしまいました。
お手数掛けて申し訳ありませんが、何か他に考えられる原因はありますでしょうか?
サーチフォームは以下
検索結果表示のモジュールは以下
壱からあぬあぬへの返信
>あぬあぬさん
こんにちは。
最初のご質問のリストだと、データベースに追加したフィールドの名前は「price_01」になっています。
一方、検索フォームおよび検索結果表示モジュールのテンプレートを見ると、フィールド名が「price01」になっています(priceの後のアンダースコアがない)。
検索フォームおよび検索結果表示モジュールの「price01」を「price_01」に全置換してください。
あぬあぬ
すみません、こちらのケアレスミスでした。
無事動作いたしました!
最後まで本当にありがとうございます。
藤本様のMT関連本は全部購入し、今読んでいる段階です。
他に無い充実度で、本当に助かっております。
ありがとうございました。
あぬあぬ
前回は、ありがとう御座いました。
今回、またご相談があるのですが・・・
前回、○○以下の検索が出来るようになったのですが、今回は△△以上○○以下の検索が出来るようにシステムを組んでみたのですが、△△以上が動作しません。○○以下は動作するんですが。
例えば、数値が3000だとした場合、検索で1000以上、5000以下で検索すると、大丈夫なんですが、1000以上のみで検索すると、ヒットしません。藤本さんの書籍を参考にプログラムを書いてみたのですが、うまく動作しません。以下にコードを記述します。
サーチフォーム
検索結果表示モジュール
プラグインファイルは前回と同様です。
壱からあぬあぬへの返信
>あぬあぬさん
こんにちは。
下限/上限の「選択しない」のoptionタグを以下のように変えれば、動作するはずです。
<option value="">選択しない</option>
ちなみに、optionタグのvalue属性を省略すると、<option>と</option>の間の値(いただいた例なら「選択しない」の文字列)がサーバーに送信されてしまい、正しく比較することができません。
あぬあぬ
単にフォームの作り方がまずかっただけですね。
お恥ずかしい限りです。
毎度毎度すみません。
本当に助かっております。
ありがとうございました。
アソーカ・タノ
いつも参考にさせていただいています。先日は早々のご回答ありがとうございました。
当記事に書かれている「4.ベースネーム/テンプレートタグ名の変更」の件でご質問がありコメントさせていただきます。
NumericCustomFieldsプラグインを導入し、1.から3.の手順を終えた後、4.の「変換元のテキスト型のフィールドを削除」と「変換先の数値型のフィールドのベースネームとテンプレートタグ名変更」は、どこで行えばいいでしょうか?
記事を拝読して、4.はカスタムフィールド一覧画面で行うものだと考えて作業を進めたのですが、変換元のテキスト型フィールドは残っていて、変換先の数値型フィールドは一覧画面には表示されていませんでした(変換元のテキスト型フィールドに入力していたデータは空白になっていました)。
phpMyAdminでmt_entry_metaテーブルを確認すると、entry_meta_typeに「変換先の数値型フィールドのベースネーム」は在りますが「変換元のテキスト型フィールドのベースネーム」は存在していませんでした。
3.と4の作業は「変換元のテキスト型フィールドに入力していたデータを、変換先の数値型フィールドにコピー」→「カスタムフィールド一覧から変換元フィールドを削除」→「変換先フィールドのベースネームとテンプレートタグ名を変換元のものに変更」ということかなと理解していたのですが、SQL文に詳しくなく、何か根本的な勘違いをしているのであれば大変恐縮なのですが、ご指摘いただければ助かります。
よろしくお願いいたします。
壱からアソーカ・タノへの返信
>アソーカ・タノさん
こんにちは。
ご質問の件ですが、変換先のカスタムフィールドは、Movable Typeの管理画面で手動で作成してください。
SQLでは作成されません。
アソーカ・タノからアソーカ・タノへの返信
藤本様
早々にご回答をいただき感謝します。
手動でフィールドを再作成します。
ありがとうございました。
アソーカ・タノからアソーカ・タノへの返信
藤本様
記事に書かれていることをもう一度確認しながら、無事数値型への変換を行うことができました。
MTのカスタムフィールドに関するテーブルスキーマ(mt_entry_metaなど)をきちんと理解できていなかったのですが、この作業を通じて勉強になりました。
ありがとうございました。