以前meta_queryで小数を扱うときの注意について書きました。
てっきりWordPressのバグかと思ってましたが、meta_queryの指定方法を間違っていたということに気付きました。
ADs
Codexでのmeta_queryの解説では
Class Reference/WP Meta Query « WordPress Codex
type (string) – Custom field type. Possible values are ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’. Default value is ‘CHAR’.
とあります。
typeに「NUMERIC」や「BINARY」という単語を指定すればいいんだな、となりますが、実はNUMERICとDECIMALの場合だけちょっと違います。
WordPress4.4の場合はwp-includes/class-wp-meta-query.php、それ以前のバージョンではwp-includes/meta.phpというファイル内でget_cast_for_type()という関数が定義されています。これを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function get_cast_for_type( $type = '' ) { if ( empty( $type ) ) return 'CHAR'; $meta_type = strtoupper( $type ); if ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\(\d+(?:,\s?\d+)?\))?|DECIMAL(?:\(\d+(?:,\s?\d+)?\))?)$/', $meta_type ) ) return 'CHAR'; if ( 'NUMERIC' == $meta_type ) $meta_type = 'SIGNED'; return $meta_type; } |
NUMERICとDECIMALだけ単なる単語ではないですね。
「type」を指定する際に、桁数の指定も含めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function customize_main_query($query) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search() ) { $query->set( 'meta_query', array( array( 'key' => 'parameter', 'value' => array(2.8,5.6), 'compare' => 'BETWEEN', 'type' => 'DECIMAL(3,1)' ) ) ); } } add_action( 'pre_get_posts', 'customize_main_query' ); |
これで全体で3桁、小数点以下1桁の数値を正しく計算してくれます。
NUMERICでも小数点を扱えますので、桁数指定をちゃんとやればNUMERIC/DECIMALを使い分ける必要はないと思います。
(データベースのバージョンや種類によっては区別する必要があるかもしれないので挙動を確認しながら実装してみてください)
桁数の指定方法については下記が分かりやすかったです。
ありがとうございます。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.2.2 固定小数点型 (真数値) – DECIMAL、NUMERIC
MySQLでdecimalを使うときの注意点 | 株式会社LIG
ADs
コメントはまだありません。