Mysql
 sql >> Base de données >  >> RDS >> Mysql

Tableaux de méta-requêtes WordPress

Essayez celui-ci avec WP_Query pas besoin de relation, utilisez simplement la partie de comparaison avec 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);

OU par get_posts essayez ceci

$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);

OU par une requête personnalisée, vous pouvez procéder comme suit

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()");

Ne stockez pas non plus un tableau d'identifiants dans une ligne, mais parcourez le tableau d'identifiants et normalisez vos données préférées manuellement Ne sérialisez pas les données dans un champ de base de données. C'est ce que Database_normalization est pour et insérez chaque identifiant dans une nouvelle ligne car

$likes = array(61, 62);

foerach($likes as $l){

update_post_meta($post->ID, "likes", $l);

}

Et ci-dessous se trouve la requête que vous avez demandée dans les commentaires de prime

$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() ");

J'ai utilisé les INNER JOINs sur wp_term_relationships et wp_term_taxonomy le tableau wp_term_relationships stocke la relation des messages et la taxonomie de la catégorie et la table wp_term_taxonomy avoir la taxonomie de la catégorie et aussi l'identifiant de la catégorie

Voici la partie qui couvre le

1. catégorie (inclure et exclure)

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

2. ignorer les messages par un tableau d'ID

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