meta_query com vários valores

Preciso da tua ajuda.

Há meu problema: eu tenho o tipo de publicação personalizado “Player”. E este CPT tem campo personalizado “Seasons”. As estações podem ter vários valores separados por vírgulas – por exemplo “2014,2015,2016” etc.

Agora eu preciso da lista de filtros do jogador que jogou em certas estações – por exemplo 2015 e 2016.

E agora eu preciso da sua ajuda com essa wp_query. Eu tento este código, mas não funciona: – /

query_posts( array( 'post_type' => 'player', 'meta_query' => array( array( 'key' => 'seasons', 'value' => array( '2015','2016'), 'compare' => 'IN', ), ), ) ); 

Por favor, ajude.

thx libor

Solutions Collecting From Web of "meta_query com vários valores"

Expandindo um pouco na resposta de @dgarceran

Geralmente, usar a class WP_Query provavelmente é uma boa idéia para consultas.

Nós queremos passar argumentos para essa consulta.

No seu caso, provavelmente queremos usar uma das seguintes opções:

  1. parameters de campo personalizados ” – meta_query
  2. parameters de Taxonomia ” – tax_query

Para um exemplo quase abrangente de todas as opções, eu gosto de fazer referência a esta essência: https://gist.github.com/luetkemj/2023628 .

Veja também o Codex: https://codex.wordpress.org/Class_Reference/WP_Query

Ambos tomam uma série de matrizes associativas, por exemplo,

Nota : Vou usar syntax compatível com o PHP 5.4

  $meta_query_args = [ [ 'key' => 'season', 'value' => [ '2015', '2016' ], 'compare' => 'IN', ], ]; 

Podemos trazer esses argumentos para nossa instância de WP_Query

  $args = [ 'post_type' => 'player', 'posts_per_page' => 100, // Set this to a reasonable limit 'meta_query' => $meta_query_args, ]; $the_query = new WP_Query( $args ); 

O que está acontecendo neste momento é que o WordPress irá verificar todas as postagens que combinam com o seu player postagem personalizado . Então, ele irá consultar os metadados que você definiu com a season chaves. Todas as postagens correspondentes a 2015 ou 2016 serão devolvidas.

Nota: usar meta_query dessa maneira geralmente não é recomendado porque é um pouco pesado no database. O consenso parece ser que as taxonomias de consulta são mais performantes (não me citem sobre isso, não consegui encontrar minha fonte)

Então, para uma alternativa rápida, eu recomendo o seguinte exemplo:

  $tax_query_args = [ [ 'taxonomy' => 'season', 'field' => 'slug', 'terms' => [ '2015', '2016' ], 'operator' => 'IN', ], ]; $args = [ 'post_type' => 'player', 'posts_per_page' => 100, // Set this to a reasonable limit 'tax_query' => $tax_query_args, ]; $the_query = new WP_Query( $args ); 

Agora, podemos realmente transmitir os dados, aqui está um exemplo de marcação:

  
< ?php while ( $the_query->have_posts() ) : $the_query->the_post(); $post_id = get_the_ID(); // $season = get_post_meta( $post_id, 'season', true ); // example if you are still going to use post meta $season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] ); ?>

< ?php the_title(); ?>

< ?php echo __( 'Season: ' ) . sanitize_text_field( implode( $season ) ); ?>

< ?php endwhile; ?>

Quando você usa WP_Query especialmente em modelos, verifique se você termina com wp_reset_postdata();

Colocando-o completamente (tl; dr)

  $tax_query_args = [ [ 'taxonomy' => 'season', 'field' => 'slug', 'terms' => [ '2015', '2016' ], 'operator' => 'IN', ], ]; $args = [ 'post_type' => 'player', 'posts_per_page' => 100, // Set this to a reasonable limit 'tax_query' => $tax_query_args, ]; $the_query = new WP_Query( $args ); ?> 
< ?php while ( $the_query->have_posts() ) : $the_query->the_post(); $post_id = get_the_ID(); // $season = get_post_meta( $post_id, 'season', true ); // example if you are still going to use post meta $season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] ); ?>

< ?php the_title(); ?>

< ?php echo __( 'Season: ' ) . sanitize_text_field( implode( $season ) ); ?>

< ?php endwhile; ?>
< ?php wp_reset_postdata();

Visão frontal da nossa consulta: Exemplo Front End Exibição do painel de controle do jogador do CPT: Exemplo de postagens do CPT Player

Espero que forneça um pouco de contexto 👍🏻

Veja como eu faria isso com The Loop e usando exemplos do Codex .

 $args = array( 'post_type' => 'player', 'meta_key' => 'age', 'meta_query' => array( array( 'key' => 'seasons', 'value' => array( 2015, 2016 ), // or array( '2015', '2016' ) 'compare' => 'IN', ), ), ); // The Query $query = new WP_Query( $args ); // The Loop if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // do something } } else { // no posts found } // Restore original Post Data wp_reset_postdata(); 

Seu problema é que você está adicionando valores em uma seqüência de caracteres como “2015,2016,2017” … e você deve separar cada valor em um campo diferente. Com a ACF você tem a opção de adicionar um repetidor de estações, e você também pode fazer uma taxonomia personalizada para salvar esses valores, em vez de um meta de publicação. Se você não quiser mudar isso, você deve recuperar seus meta-dados da publicação primeiro com get_post_meta e usar explodir com o PHP.