lucas
Necesito permitir que los usuarios puedan ordenar los resultados de un wp_query por algunos valores de campo personalizados. Estos incluyen Distancia, Fecha y Precio. La distancia y la fecha funcionan bien, ¡pero el precio no arroja ningún resultado!
Creo que mi problema es que el campo personalizado por el que estoy ordenando es un campo de texto y estoy tratando de ordenar por valor numérico. Sin embargo, si configuro el campo como un campo numérico, no puedo agregar decimales al número, ¿o sí?
Entonces, ¿alguien sabe una forma de ordenar wp_query por valor numérico cuando el campo personalizado que se usa es un campo de texto?
Aquí está mi consulta en caso de que ayude:
$args = array(
// general
'post__in' => $postIDs,
'post_type' => 'event',
'posts_per_page' => 10,
'paged' => $paged,
'meta_key' => 'adult',
'orderby' => 'meta_value_num',
'order' => 'ASC',
// category filter
'tax_query' => $taxQuery,
// date filter
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'date_%_start-date',
'value' => $when,
'compare' => '>=',
'type' => 'NUMERIC'
),
array (
'key' => 'date_%_end-date',
'value' => $when2,
'compare' => '<=',
'type' => 'NUMERIC'
)
)
);
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query( $args );
EDITAR
Después de la respuesta a continuación, podría editar la consulta SQL para usar CAST
para hacer que el valor meta sea un número entero. Sin embargo, no estoy muy seguro acerca de la sintaxis, esto es lo que estoy pensando en este momento, pero parece que no funciona:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
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)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
WHERE 1=1
AND wp_posts.ID IN (66864,44870, ... more numbers ... ,66261,31361)
AND ( wp_term_relationships.term_taxonomy_id IN (2) )
AND wp_posts.post_type="event"
AND (wp_posts.post_status="publish" OR wp_posts.post_status="private")
AND (CAST(wp_postmeta.meta_key = 'adult' AS UNSIGNED) // CAST attempt here...
AND (mt1.meta_key LIKE 'date_%_start-date' AND CAST(mt1.meta_value AS SIGNED) >= '20140619')
AND (mt2.meta_key LIKE 'date_%_end-date' AND CAST(mt2.meta_value AS SIGNED) <= '20140626') )
AND substr(wp_postmeta.meta_key, 1, 6) = substr(mt1.meta_key, 1, 6)
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0 ASC
LIMIT 0, 10
EDITAR
Intentando usar float y ACF update_field para cambiar el valor a un número entero, pero el código no parece hacer nada por alguna razón:
function update_adult_field( $value, $post_id, $field ) {
$value = (float) $value;
return $value;
}
add_filter('acf/update_value/name=adult', 'update_adult_field', 10, 3);
si configuro el campo como un campo numérico, no puedo agregar decimales al número, ¿o sí?
Creo floatval()
podría ser de alguna utilidad para usted aquí. Le permite obtener el valor flotante de una cadena.
$my_var="1.3142";
$float_value_of_my_var = floatval( $my_var );
$float_value_of_my_var
tendrá un valor numérico.
Alternativamente, puede lanzar su variable como un flotador
(float) $my_var;
Árbitro: http://www.php.net//manual/en/function.floatval.php
-
Ah bien. No creo que pueda usar PHP float, porque necesito la lógica para ejecutar la consulta. Pero, he visto MySQL y
CAST
antes, que podía editar en la consulta usando WordPressadd_filter
función. No estoy muy seguro de cómo usarCAST
aunque. Actualizaré mi pregunta con una idea que tengo…– lukeseager
19 de junio de 2014 a las 15:10
-
En su pregunta, menciona si alguien conoce una forma de obtener un
wp_query
para ordenar por valor numérico cuando el campo personalizado que se utiliza es un campo de texto. ¿No sería mejor encasillar el valor del campo personalizado al recibir esa variable del usuario? El campo del formulario aún puede ser una entrada de texto, pero su secuencia de comandos de procesamiento PHP puede realizar la conversión de tipos. Entonces tendrás tuprice
variable que será de tipofloat
.– henry wright
19 de junio de 2014 a las 16:34
-
¿Sabe si eso es posible si estoy usando ACF (advancedcustomfields.com) para crear los campos?
– lukeseager
19 de junio de 2014 a las 21:44
-
Mirando la documentación, supongo
update_value
es el filtro que usarías. Ver aquí– henry wright
19 de junio de 2014 a las 22:17
-
Gracias por eso. Lo intenté pero no pareció tener ningún efecto por alguna razón. Actualicé mi pregunta con el código que probé.
– lukeseager
20 de junio de 2014 a las 12:22