web-dev-qa-db-ja.com

WPDB Multiple siteの投稿と特集画像を入手

以下のコードを使用して、5つのWordpressサイトの投稿をクエリし、それらを配列にマージし、日付順に並べ替えて表示します。

//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;

この方法では投稿のおすすめ画像を取得できないことを除けば、これは非常にうまく機能しています。私はwp_get_attachment_image_srcのようなネイティブ関数を使用することはできません、そして各ポストがポストメタを試みるためにループに入っている間にDBに再度問い合わせることは最終的にはやり過ぎで、多すぎるクエリがあるのです。

最初のクエリでクエリしている投稿のpostmetaを取得する方法はありますか。それとも、あまり多くのクエリを作成しないようにするために使用できる方法はありますか。

3
RCNeil

これは、postmetaテーブルを結合して_wp_attached_fileメタ値を取得することによって、投稿の投稿メタを取得する方法の1つです。

これを試して:

$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