web-dev-qa-db-fra.com

WPDB messages de plusieurs sites et obtenir des images en vedette

J'utilise le code ci-dessous pour interroger 5 sites Wordpress sur leurs publications, les fusionnant dans un tableau, les triant par date et les affichant ensuite:

//SITE 1
$mydb = new wpdb('xxxx','xxxx','xxxx','localhost');
if($mydb) { 
    $query1 = $mydb->get_results("SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish'", OBJECT); 
}
$mydb->flush(); 

//SITE 2
$mydb = new wpdb('xxxx','xxxx','xxxx','localhost');
if($mydb) { 
    $query2 = $mydb->get_results("SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish'", OBJECT); 
}
$mydb->flush(); 

//SITE 3
$mydb = new wpdb('xxxx','xxxx','xxxx','localhost');
if($mydb) { 
    $query3 = $mydb->get_results("SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish'", OBJECT); 
}
$mydb->flush(); 

//SITE 4
$mydb = new wpdb('xxxx','xxxx','xxxx','localhost');
if($mydb) { 
    $query4 = $mydb->get_results("SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish'", OBJECT); 
}
$mydb->flush(); 

//SITE 5
$mydb = new wpdb('xxxx','xxxx','xxxx','localhost');
if($mydb) { 
    $query5 = $mydb->get_results("SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish'", OBJECT); 
}
$mydb->flush(); 


//MERGE ARRAYS
$allsitearrays = array_merge($query1, $query2, $query3, $query4, $query5);


//SORT BY DATE
function cmp($a, $b) {
  if ($a->post_date == $b->post_date) {
    return 0;
  } else {
    return $a->post_date < $b->post_date ? 1 : -1; // reverse order
  }
}
usort($allsitearrays, 'cmp');



//OUTPUT
if ( $allsitearrays ):
    global $post; 
    foreach($allsitearrays as $post) {

        //OUTPUT HERE

    }
endif;

Cela fonctionne très bien, sauf que je ne peux pas récupérer l’image sélectionnée de la publication avec cette méthode. Je ne peux pas utiliser les fonctions natives telles que wp_get_attachment_image_src et j'ai envie d'interroger à nouveau la base de données alors que je suis dans la boucle pour chaque publication. Essayer de découvrir que postmeta serait finalement trop complexe et aurait trop de requêtes.

Existe-t-il un moyen d’obtenir le postmeta des articles interrogés lors de la première interrogation ou une méthode que je peux utiliser pour éviter de faire autant d’interrogations?

3
RCNeil

Voici un moyen d'obtenir le postmeta des publications en rejoignant la table postmeta et en récupérant la méta valeur _wp_attached_file.

Essaye ça:

$mydb->get_results( select a.*, thumb.meta_value 
from wp_posts a 
left join (select b.post_id, c.meta_value 
from wp_postmeta b, wp_postmeta c 
where b.meta_key = '_thumbnail_id' 
and b.meta_value = c.post_id 
and c.meta_key = '_wp_attached_file') as thumb 
on thumb.post_id = a.ID 
where a.post_type = 'post' 
and a.post_status = 'publish', OBJECT );
2
windyjonas