ちょっとそこに私はWP_Query数値メタクエリによって生成される以下のSQLクエリを持っています:
SELECT SQL_CALC_FOUND_ROWS wp_postmeta.meta_value FROM wp_posts
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )
WHERE 1=1
AND ( wp_postmeta.meta_key = 'price'
AND ( mt1.meta_key = 'price'
AND CAST(mt1.meta_value AS SIGNED) BETWEEN '0' AND '9999' ) )
AND wp_posts.post_type = 'product'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID ORDER BY CAST(wp_postmeta.meta_value AS SIGNED) DESC LIMIT 0, 15
WordPressの問い合わせ - もしそれが助けになるなら - はこのように生成され、それは正しいはずです:
array(6) {
["orderby"]=>
array(1) {
["price"]=>
string(4) "DESC"
}
["meta_query"]=>
array(3) {
["relation"]=>
string(3) "AND"
["sortprimary_clause"]=>
array(3) {
["key"]=>
string(17) "price"
["compare"]=>
string(6) "EXISTS"
["type"]=>
string(7) "numeric"
}
[0]=>
array(4) {
["key"]=>
string(17) "price"
["value"]=>
array(2) {
[0]=>
float(0)
[1]=>
float(9999)
}
["compare"]=>
string(7) "BETWEEN"
["type"]=>
string(7) "numeric"
}
}
["tax_query"]=>
array(1) {
["relation"]=>
string(3) "AND"
}
["post_type"]=>
string(7) "product"
["posts_per_page"]=>
int(15)
["paged"]=>
string(1) "1"
}
結果は次のとおりです。
ご覧のとおり、SQLは基本的に正しい値を順序付けていますが、INTEGERサイズの価格でのみです。小数点記号は完全に無視されるようです。浮動小数点数で正しく動作するようにSQLを変更する方法を教えてください。それはWordPressの問題ですか、それとも浮動小数点数を正しく扱えるようにWP_Queryを変更することができますか?
編集:私は問題を見つけました! ORDER BY CAST(wp_postmeta.meta_value AS SIGNED)
はORDER BY CAST(wp_postmeta.meta_value AS DECIMAL(M,3))
であるべきです。
WP_Queryを比較のためにIntegerではなく10進値を使うように変更するにはどうすればよいですか?
解決しました。編集後は簡単でした。 meta_queryではtype => 'decimal(x、x)'を使用できます。最大精度は10進数(65,30)です。
https://dev.mysql.com/doc/refman/5.7/ja/precision-math-decimal-characteristics.html
array(6) {
["orderby"]=>
array(2) {
["uss_product_price"]=>
string(4) "DESC"
["title"]=>
string(3) "ASC"
}
["meta_query"]=>
array(3) {
["relation"]=>
string(3) "AND"
["sortprimary_clause"]=>
array(3) {
["key"]=>
string(17) "price"
["compare"]=>
string(6) "EXISTS"
["type"]=>
string(13) "decimal(30,5)"
}
[0]=>
array(4) {
["key"]=>
string(17) "price"
["value"]=>
array(2) {
[0]=>
float(0)
[1]=>
float(9999)
}
["compare"]=>
string(7) "BETWEEN"
["type"]=>
string(7) "decimal(30,5)"
}
}
["tax_query"]=>
array(1) {
["relation"]=>
string(3) "AND"
}
["post_type"]=>
string(7) "product"
["posts_per_page"]=>
int(15)
["paged"]=>
string(1) "2"
}