meta_query con múltiples valores
Necesito tu ayuda.
Este es mi problema: Tengo un tipo de post personalizado "Player". Y este CPT tiene un campo personalizado "Seasons". Las temporadas pueden tener múltiples valores separados por coma - por ejemplo "2014,2015,2016" etc.
Ahora necesito filtrar la lista de jugadores que jugaron en ciertas temporadas - por ejemplo 2015 y 2016.
Y ahora necesito tu ayuda con este wp_query
. Intenté este código, pero no funciona :-/
query_posts(
array(
'post_type' => 'player',
'meta_query' => array(
array(
'key' => 'seasons',
'value' => array( '2015','2016'),
'compare' => 'IN',
),
),
)
);
Por favor ayuda.
Gracias,
libor

Ampliando un poco la respuesta de @dgarceran
Generalmente, usar la clase WP_Query
es probablemente una buena idea para consultar entradas.
Querremos pasar argumentos a esa consulta.
En tu caso probablemente querremos usar uno de los siguientes:
- "Parámetros de Campos Personalizados" -
meta_query
- "Parámetros de Taxonomía" -
tax_query
Para un ejemplo casi completo de todas las opciones, me gusta referenciar este gist: https://gist.github.com/luetkemj/2023628.
También ver el Codex: https://codex.wordpress.org/Class_Reference/WP_Query
Ambos toman un array de arrays asociativos, por ejemplo:
Nota: Estaré usando sintaxis compatible con PHP 5.4 en adelante
$meta_query_args = [
[
'key' => 'season',
'value' => [ '2015', '2016' ],
'compare' => 'IN',
],
];
Podemos incluir esos argumentos en nuestra instancia de WP_Query
$args = [
'post_type' => 'player',
'posts_per_page' => 100, // Establece esto a un límite razonable
'meta_query' => $meta_query_args,
];
$the_query = new WP_Query( $args );
Lo que está sucediendo en este punto es que WordPress va a verificar todas las entradas que coincidan con tu tipo de entrada personalizado player
. Luego, consultará los metadatos que hayas establecido con la clave season
. Cualquier entrada que coincida con 2015
o 2016
será devuelta.
Nota: usar meta_query
de esta manera no es generalmente recomendado porque es un poco pesado para la base de datos. El consenso parece ser que consultar taxonomías es más eficiente (no me cites en eso, no pude encontrar mi fuente)
Así que para una alternativa rápida, recomiendo el siguiente ejemplo:
$tax_query_args = [
[
'taxonomy' => 'season',
'field' => 'slug',
'terms' => [ '2015', '2016' ],
'operator' => 'IN',
],
];
$args = [
'post_type' => 'player',
'posts_per_page' => 100, // Establece esto a un límite razonable
'tax_query' => $tax_query_args,
];
$the_query = new WP_Query( $args );
Ahora podemos iterar a través de los datos, aquí hay un ejemplo de marcado:
<section class="season-list">
<?php while ( $the_query->have_posts() ) : $the_query->the_post();
$post_id = get_the_ID();
// $season = get_post_meta( $post_id, 'season', true ); // ejemplo si aún vas a usar metadatos de entrada
$season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] );
?>
<h3><?php the_title(); ?></h3>
<p><?php echo __( 'Temporada: ' ) . sanitize_text_field( implode( $season ) ); ?></p>
<?php endwhile; ?>
</section>
Cuando uses WP_Query
especialmente en plantillas, asegúrate de terminar con wp_reset_postdata();
Juntando todo (resumen)
$tax_query_args = [
[
'taxonomy' => 'season',
'field' => 'slug',
'terms' => [ '2015', '2016' ],
'operator' => 'IN',
],
];
$args = [
'post_type' => 'player',
'posts_per_page' => 100, // Establece esto a un límite razonable
'tax_query' => $tax_query_args,
];
$the_query = new WP_Query( $args );
?>
<section class="season-list">
<?php while ( $the_query->have_posts() ) : $the_query->the_post();
$post_id = get_the_ID();
// $season = get_post_meta( $post_id, 'season', true ); // ejemplo si aún vas a usar metadatos de entrada
$season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] );
?>
<h3><?php the_title(); ?></h3>
<p><?php echo __( 'Temporada: ' ) . sanitize_text_field( implode( $season ) ); ?></p>
<?php endwhile; ?>
</section>
<?php
wp_reset_postdata();
Vista frontal de nuestra consulta:
Vista del panel de control de las entradas CPT Player:
Espero que esto proporcione un poco de contexto

Así es como lo haría con The Loop y usando ejemplos del Codex.
$args = array(
'post_type' => 'player',
'meta_key' => 'age',
'meta_query' => array(
array(
'key' => 'seasons',
'value' => array( 2015, 2016 ), // o array( '2015', '2016' )
'compare' => 'IN',
),
),
);
// La Consulta
$query = new WP_Query( $args );
// The Loop
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// hacer algo
}
} else {
// no se encontraron posts
}
// Restaurar los datos originales del Post
wp_reset_postdata();
Tu problema es que estás agregando los valores en una sola cadena como "2015,2016,2017"... y deberías separar cada valor en un campo diferente. Con ACF tienes la opción de agregar un repeater para las temporadas, y también puedes hacer una taxonomía personalizada para guardar estos valores, en lugar de un post meta. Si no quieres cambiar eso, deberías recuperar primero tus datos de post meta con get_post_meta, y usar explode con PHP.
