meta_query clave valor desde array

19 may 2016, 12:29:32
Vistas: 21.5K
Votos: 3

Tengo un tipo de publicación personalizada llamada 'game' con algunos campos ACF. Uno de los campos es un Object Post (llamado review_link) que acepta publicaciones de una categoría llamada 'reviews'. Otro campo es un campo de taxonomía (llamado gametags) que busca la taxonomía post_tag de 'posts'

Esto es lo que estoy tratando de lograr:

  1. Cuando estés leyendo una publicación (post_type=post) dentro de la categoría Reviews, poder agregar información en la barra lateral del Juego (post_type=game) que tiene esta publicación específica en el campo Post Object.

  2. Cuando estés leyendo una publicación (post_type=post) de cualquier categoría, poder obtener las etiquetas de esa publicación y buscar en los campos ACF de Games (post_type=game), específicamente en el campo de taxonomía, para encontrar etiquetas coincidentes y luego mostrar información del Juego.

Mi código para el caso 1 es el siguiente y funciona perfectamente:

$reviewID = $post->ID;
if(in_category('reviews') ) {

    $reviewArgs = array(
      'post_type'    => 'game',
      'meta_query' => array(
         array(
           'key' => 'review_link',
           'value' => ''.$reviewID.'',
           'compare' => 'LIKE'
         )
       )
    );

}

Ahora para el caso 2 he intentado lo siguiente:

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

Los $tag_ids para un ejemplo de publicación son: 818,436,435,43,46,77. Si reemplazo los $tag_ids en el código anterior con 435, coincide. Pero si intento agregarlo como un array no funciona. También he intentado serializar el array, recorrer el array, etc. Nada funciona. Podría hacer un array de meta queries pero el problema es que el número de etiquetas en cada publicación es aleatorio. También he intentado convertir el array en una cadena y usar 'LIKE' en lugar de 'IN' y nada.

De hecho, el código anterior lanza una advertencia: Warning: trim() expects parameter 1 to be string, array given in /.../public_html/wp-includes/class-wp-meta-query.php on line 594

He intentado casi todo para hacer funcionar el caso 2 y no pude. Por lo que me doy cuenta, meta_query no funciona como se espera cuando el valor meta es un array, aunque el Codex especifica que puede ser un array. Todo el código anterior está colocado en sidebar.php.

Cualquier consejo o sugerencia sería apreciado

Gracias de antemano

0
Todas las respuestas a la pregunta 2
10

No estoy seguro si se puede comparar un array directamente con otro, pero puedes crear un bucle para configurar un array meta_query que verificará cada uno de los IDs dentro del campo por separado:

$tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );

$meta_query = array('relation' => 'OR');

foreach ($tags_ids as $tag_id) {
    $meta_query[] = array(
        'key' => 'gametags',
        'value' => $tag_id,
        'compare' => 'IN'
    );
}

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => $meta_query
);

Nota: Esto podría generar errores si no hay etiquetas establecidas para el post, por lo que quizás quieras agregar un manejo alternativo para ese caso.

EDITO: Prueba esto para verificar coincidencias exactas más adelante...

$review_query = new WP_Query( $reviewArgs ); 
while( $review_query->have_posts() ) { 
    $review_query->the_post(); 
    global $post; $checkmatch = false;
    $gametags = get_post_meta($post->ID,'gametags');
    if (!is_array($gametags)) {$gametags = explode(',',$gametags);}
    foreach ($tags_ids as $tag_id) {
        if (in_array($tag_id,$gametags)) {$checkmatch = true;}
    }
    if ($checkmatch) {
         // mostrar salida
    }
}
19 may 2016 13:12:04
Comentarios

¡Muchas gracias! ¡De esta manera funciona!

¿Hay alguna forma de ser más específico en la comparación? Porque IN devuelve '152' y '1524'?

Pantso Pantso
19 may 2016 14:05:56

prueba con = o EQUALS en lugar de IN si buscas una coincidencia exacta

majick majick
19 may 2016 14:09:26

espera no, ¿estás seguro?, ¿no haría eso LIKE en lugar de IN?

majick majick
19 may 2016 14:12:16

Sí, justo ahora con un ejemplo en vivo, si uso IN obtengo '14739' y '14885'! LIKE y = no funcionan! Hmm quizás hay un problema en mi lógica? De todos modos, gracias por tu tiempo :)

Pantso Pantso
19 may 2016 14:18:39

perdón, mi error IN realmente debería ser la solución, pero ¿estás configurando gametags como un array o como un string? Puede marcar la diferencia porque 152 está en el string 1524 pero no en el array('1525') si entiendes lo que quiero decir.

majick majick
19 may 2016 14:19:28

el $tag_ids es este array por ejemplo:

Array ( [0] => 818 [1] => 436 [2] => 435 [3] => 43 [4] => 46 [5] => 77 )

Intenté cambiando el 'value' => '"'. $tag_id .'"' pero tampoco funciona :P

Pantso Pantso
19 may 2016 14:21:58

no, entiendo que es el array $tag_ids pero ¿cómo se está estableciendo el campo meta gametags, como un array o como un string? es decir, si haces get_post_meta($post->ID,'gametags'); para tu ejemplo, ¿qué obtienes?

majick majick
19 may 2016 14:25:05

Un array vacío en realidad. Hm, qué demonios. De todos modos lo investigaré más por mi cuenta, no quiero molestarte más.

Pantso Pantso
19 may 2016 14:29:51

:-) no hay problema, prueba con el código adicional que añadí para volver a probar las coincidencias después del hecho.

majick majick
19 may 2016 14:40:50

Si tu camino te lleva a Grecia, ¡te debo una cerveza! :) Gracias de nuevo

Pantso Pantso
19 may 2016 14:43:30
Mostrar los 5 comentarios restantes
1

Dado que $tag_ids = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) ); devuelve un array, deberías poder usarlo como

$reviewArgs = array(
   'post_type' => 'game',
   'meta_query' => array(
         array(
             'key' => 'gametags',
             'value' => $tag_ids,
             'compare' => 'IN'
         )
    ) 
);

¿Tienes los metakeys gametags para el post-type games? ¿Estás usando WP_Query? ¿O get_posts()?

19 may 2016 13:45:41
Comentarios

Sí, el resto del código es

$review_query = new WP_Query( $reviewArgs ); while( $review_query->have_posts() ) { $review_query->the_post();

Pantso Pantso
19 may 2016 14:04:24