Índice de contenidos
Consultas complejas con campos personalizados – meta_query WordPress
En el artículo anterior, Ordenar post utilizando campos personalizados en WordPress, realizamos consultas simples sobre un metadato. Uno de los ejemplos del post, mostraba como ordenar de forma sencilla nuestras entradas por un campo personalizado llamado precio. En este artículo aprenderemos a utilizar la clase meta_query para implementar consultas complejas sobre varios campos personalizados o custom fields.
Este artículo amplía la información descrita en las entradas anteriores de este blog:
Campos personalizados en WordPress – Custom Fields
Ordenar post utilizando campos personalizados en WordPress
La clase meta_query
WordPress permite desde la versión 3.2.0 realizar consultas sobre múltiples metadatos de nuestros post. Estas consultas complejas hacen uso de la clase meta_query que encontrarás en la siguiente ruta de tu WP:
wp-includes/class-wp-meta-query.php.
Cómo utilizar meta_query
$args = array( 'post_type' => 'juguete', 'posts_per_page' => -1, 'meta_query' => array( ); $query_jueguete = new WP_Query( $args );
Como podemos observar dentro de nuestra consulta wp_query hemos añadido un nuevo argumento: meta_query.
meta_query le indica a WordPress que vamos a realizar una consulta para campos personalizados.
Estructura meta_query
Cuando trabajamos con varios campos, la estructura se compone de un array principal donde incluimos tantos arrays como campos personalizados necesitemos utilizar y una relación entre campos.
La relación (‘relation’) es opcional por defecto implementada como AND. Indica la relación lógica que existe entre los distintos campos personalizados (varios arrays).
'meta_query' => array( 'relation' // valor opcional por defecto 'AND', array( //nuevo array por cada campo personalizado o nueva relación lógica ), array( //nuevo array por cada campo personalizado o nueva relación lógica ), ),
Qué argumentos aceptan los arrays de meta_query
Cada array dentro de meta_query acepta los siguientes argumentos:
- key (string) – es la clave de nuestro custom field o campo personalizado, por ejemplo fabricante o precio.
- value (string|array) – admite dos tipos de valores, un string, el valor de nuestro campo personalizado, por ejemplo Disney. También admite un array, por ejemplo array(50,100).
- compare (string) – Operador lógico que admite los siguientes valores: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘EXISTS’ (para WP >= 3.5), ‘NOT EXISTS’ (para WP >= 3.5). ‘REGEXP’, ‘NOT REGEXP’ y ‘RLIKE’ ( para WordPress 3.7). Su valor por defecto es: ‘=’.
- type (string) – El tipo del campo personalizado. Admite los siguientes valores: ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’. Su valor por defecto es: ‘CHAR’.
'meta_query' => array( array( 'key' => '', 'value' => '', 'compare' => '', 'type' => ), ),
Vamos a exponer ejemplos de código real para poder entender mejor su funcionamiento.
Ejemplos meta_query
Ejemplo dos campos con relación AND
1- El código muestra entradas personalizadas tipo ‘juguete’, cuyo fabricante sea Disney y su precio esté entre 50€ y 100€. Cuidado con el uso de BETWEEN sólo acepta los valores del array incluidos entre 50 y 100, es decir precio >50 o <100.
$args = array( 'post_type' => 'juguete', 'posts_per_page' => -1, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'Fabricante', 'value' => 'Disney', 'compare' => '=', ), array( 'key' => 'precio', 'value' => array(50,100), 'type' => 'numeric', 'compare' => 'BETWEEN', ), ), ); $query_jueguete = new WP_Query( $args );
Ejemplo dos campos con relación AND y manejando fechas
2- El siguiente código mostrará en pantalla las entradas personalizadas tipo ‘evento’, cuya ‘fecha’ esté comprendida entre el día de hoy y los próximos 30 días y se celebren en la ‘ciudad’ de ‘Valencia’.
De nuevo cuidado con el uso de BETWEEN, vemos que los extremos del array son un día menos que la fecha actual y un día más que la fecha pasados 30 días.
$args = array( 'post_type' => 'evento', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'fecha_evento', 'value' => array( date( 'Ymd', strtotime( '-1 day' ) ), date( 'Ymd', strtotime( '+31 days' ) ) ), 'compare' => 'BETWEEN', 'type' => 'DATE' , ), array( 'key' => 'ciudad', 'value' => 'Valencia', 'compare' => 'BETWEEN', ), ), ); $proximos_eventos = new WP_Query( $args );
Ejemplo tres campos y doble relación lógica
3- Ejemplo doble relación lógica entre campos personalizados. Muestra los post tipo ‘juguete’ si el fabricante es ‘Marvel’ y la edad recomendada del juguete mayor o igual a 4 años o el precio sea > 50€ y < 100€.
Todos los juguetes de Marvel para niños de 4 años o más y todos los juguetes de Marvel cuyo precio es mayor a 50 y menor a 100€.
$args = array( 'post_type' => 'juguete', 'posts_per_page' => -1, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'fabricante', 'value' => 'Marvel', 'compare' => '=' ), array( 'relation' => 'OR', array( 'key' => 'edad', 'value' => '4', 'type' => 'numeric', 'compare' => '>=' ), array( 'key' => 'precio', 'value' => array(50,100), 'type' => 'numeric', 'compare' => 'BETWEEN' ), ) //cierra OR ) //cierra AND ); $query_jueguete = new WP_Query( $args );
Más información
Si necesitas más información sobre construir meta_query y sus argumentos te recomiendo ir a la página de codex de WordPress.
Muy instructivo tu tuto, me ha servido para entender la dinámica, te los agradezco, difícil de encontrar temas semejantes. Mi problema: he creado una red social con buddypres, con campos extendidos, donde se inscriben profesionales de diferentes áreas y ubicados en diferentes ciudades de mi país, necesito listarlos agrupados por profesión y por ciudades, supongo que puedo lograrlo con «wp_user_meta query»,pero todavia no lo logro, si pudieras echarme una manito, te lo agradecería mucho.