Arrays Word Query Meta Query

Estoy creando una forma de mis usuarios para “me gusta” una publicación.

Tendré una serie de usuarios a los que les hayan gustado las publicaciones:

$user_ids = array(60, 61, 62, 63); 

Y luego, una publicación tendrá un post_meta que guarda la identificación del usuario cuando se hace clic en el botón “Me gusta” en una publicación, así:

 // Build array of user IDs that have liked this post $likes = array(61, 62); // Save array update_post_meta($post->ID, likes, $likes); 

Entonces, ¿cómo puedo devolver todas las publicaciones que me gustan por los usuarios? Así es como lo estoy haciendo actualmente, que no funciona.

 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, 'orderby' => 'rand', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'likes', 'value' => $user_ids, 'compare' => 'IN' ) ) ); $posts = get_posts($args); 

Esto debería devolver todas las publicaciones que tienen ’60, 61, 62, 63 ‘guardadas en el meta’ Me gusta ‘de las publicaciones. Pero devuelve 0 resultados.

Ahora, creo que esto se debe a que WordPress serializa las matrices cuando se guardan en una post_meta.

Entonces, ¿cómo hago una consulta como esta? ¿Es posible? Tal vez tengo que usar la clase $ wpdb.

¡Gracias!

Pruebe este con WP_Query sin necesidad de relación solo use la parte de comparación con IN

  $user_ids = array(60, 61, 62, 63); $args = array( 'post_type' => 'post', 'meta_key' => 'likes', 'post_status' => 'publish', 'posts_per_page' => -1, 'orderby' => 'rand', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'likes', 'value' => $user_ids, //array 'compare' => 'IN', ) ) ); $query = new WP_Query($args); 

Vea el ejemplo dado arriba “Parámetros de tiempo” Encabezado WP_Query

O por get_posts intente esto

 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, 'orderby' => 'rand', 'meta_query' => array( array( 'key' => 'likes', 'value' => $user_ids, 'compare' => 'IN' ) ) ); $posts = get_posts($args); 

O mediante una consulta personalizada puede hacer lo siguiente

 global $wpdb; $liked_posts=$wpdb->get_results("SELECT * FROM `wp_posts` WHERE post_type='post' AND post_status ='publish' AND ID IN( SELECT post_id FROM `wp_postmeta` WHERE meta_key='likes' AND meta_value IN (".join(',',$user_ids).") ) ORDER BY RAND()"); 

Además, no almacene una matriz de identificadores en una fila, sino que realice un ciclo a través de la matriz de identificadores y normalice sus datos de “Me gusta” manualmente. No serialice los datos en un campo de base de datos. Para eso sirve Database_normalization e inserte cada identificación en una nueva fila porque

WordPress almacena los meta values ​​como cadenas. Cuando pasas update_post_meta una matriz, automáticamente la convierte en una cadena. Lo que tendrá que hacer es unserialize cuando intente leer los datos, pero en mysql no puede unserialize datos de la columna en la consulta porque mysql no trata sobre la serialización de php.

 $likes = array(61, 62); foerach($likes as $l){ update_post_meta($post->ID, "likes", $l); } 

Y a continuación está la consulta que ha solicitado en los comentarios generosos

Si se proporciona una respuesta de $ wpdb, explique cómo factorizar la categoría (incluir y excluir) e ignorar las publicaciones mediante una matriz de ID.

 $liked_posts=$wpdb->get_results(" SELECT * FROM `wp_posts` wp INNER JOIN `wp_term_relationships` wtr ON (wp.`ID`=wtr.`object_id`) INNER JOIN `wp_term_taxonomy` wtt ON (wtr.`term_taxonomy_id` =wtt.`term_taxonomy_id`) WHERE wp.post_type='post' AND wp.post_status ='publish' AND wp.ID IN( SELECT post_id FROM `wp_postmeta` WHERE meta_key='likes' AND meta_value IN (".join(',',$user_ids).") ) AND wp.ID NOT IN (100,101,102) AND wtt.`term_id` IN(1,2,3) AND wtt.`term_id` NOT IN (4,5,6,) ORDER BY RAND() "); 

He usado INNER JOINs en wp_term_relationships y wp_term_taxonomy la tabla wp_term_relationships almacena la relación de publicaciones y la taxonomía de categoría y la tabla wp_term_taxonomy tiene la taxonomía de la categoría y también la identificación de categoría

Aquí está la parte que cubre el

1. categoría (incluir y excluir)

 AND wtt.`term_id` IN(1,2,3) AND wtt.`term_id` NOT IN (4,5,6,) 

2. ignorar publicaciones por una matriz de ID

 AND wp.ID NOT IN (100,101,102) or $postids =array(100,101,102); AND wp.ID NOT IN (".join(',',$postids).") 

Vas a tener problemas con tu enfoque actual porque, como notas, los identificadores se guardan como matrices serializadas en un solo campo. Un enfoque más fácil sería guardar cada uno como una sola entrada postmeta. Entonces meta_key = “me gusta” y meta_value = ID de usuario.

Entonces, para almacenar el interruptor “Me gusta” de update_post_meta a add_post_meta:

 /** The fourth parameter, false, tells WP that there can be multiple * post_meta entries with the same meta_key. It's false by default, just here * here for reference */ add_post_meta($post->ID, 'like', $user_id, false); 

Luego, para obtener mensajes que le gusten a un usuario específico, simplemente lo haría:

 $liked_posts = $wpdb->get_results("SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = 'like' AND meta_value = $user_id"); 

Para obtener resultados para una cantidad de usuarios a la vez, como ID de usuario 4, 23, 39, etc.

 $liked_posts_by_user = $wpdb->get_results("SELECT meta_value as user_id, GROUP_CONCAT(post_id) as posts FROM {$wpdb->prefix}wp_postmeta WHERE meta_value IN('22','23','24') GROUP BY user_id 

Eso te dará resultados como:

  user_id posts 23 1 25 2,40,3 

Así que simplemente reemplace la porción IN de la consulta con su matriz de ID de usuario.

Tuve un problema similar y lo resolví utilizando serialize (), puedes usar ir en caso de que el valor con el que estás trabajando sea un entero, aquí está mi ejemplo:

  $args = array( 'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => serialize(strval($my_id)), 'compare' => 'LIKE' ) ) ); $posts = get_posts( $args ); 

y eso es todo, tienes lista tu meta consulta.

Tu consulta es correcta Pero como está almacenando identificadores de usuario como una cadena, su consulta no funcionará. Guarde el ID de usuario un solo valor meta para la publicación.

 add_post_meta($post->ID, 'like', $user_id, false); 

y reemplace 'compare' => 'IN' con 'compare' => 'LIKE'