Hé là j'ai la requête SQL suivante qui est générée par la méta requête numérique WP_Query:
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
La requête WordPress - si cela aide - est générée comme ceci et devrait être correcte:
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"
}
Le résultat est le suivant:
Comme vous pouvez le constater, SQL commande les valeurs BASICALLY correctes, mais uniquement dans la taille INTEGER des prix. Le séparateur décimal semble être complètement ignoré. Comment puis-je modifier le code SQL afin de fonctionner correctement avec des nombres à virgule flottante. Est-ce un problème WordPress ou puis-je changer WP_Query pour qu'il fonctionne correctement avec les nombres à virgule flottante?
EDIT: j'ai trouvé le problème! ORDER BY CAST(wp_postmeta.meta_value AS SIGNED)
devrait être ORDER BY CAST(wp_postmeta.meta_value AS DECIMAL(M,3))
.
La question est donc la suivante: Comment puis-je changer WP_Query pour utiliser une valeur décimale à des fins de comparaison au lieu d’Integer?
Résolu Après l'édition, c'était facile. Il est permis d'utiliser le type => 'décimal (x, x)' dans meta_query. La précision maximale est décimale (65,30).
https://dev.mysql.com/doc/refman/5.7/en/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"
}