meta_query clave valor desde array
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:
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.
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

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
}
}

¡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'?

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 :)

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.

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

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?

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

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

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()?
