マルチサイトの親サイトに、親・子サイトの投稿を混ぜて一覧表示させるというもの。
いろいろなサイトを参考に、親サイトのfront-page.php
にこんなソースを書いていました。
<dl class="topics-list">
<?php
$sql = '';
$blog_id_arr = array(1,2,3,4);//取得するブログIDの配列
$tmp = $blog_id_arr;
foreach($blog_id_arr as $b_id){
next($tmp);
switch_to_blog($b_id);
$sql .= <<<HERE
(SELECT *, $b_id as blog_id
FROM $wpdb->posts
WHERE post_type = 'post'
AND post_status = 'publish')
HERE;
if(current($tmp) !== false){
$sql .= "UNION\n";
}
restore_current_blog();
}
$sql .= <<<HERE
ORDER BY post_date DESC
LIMIT 3
HERE;
$posts = $wpdb->get_results($sql);
?>
<?php
foreach ($posts as $post):
switch_to_blog($post->blog_id);
setup_postdata($post);
?>
<dt><?php the_time('Y年m月d日'); ?>【<?php bloginfo( 'name' ); ?>】</dt>
<dd><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dd>
<?php endforeach;?>
<?php wp_reset_postdata();?>
<?php restore_current_blog();?>
</dl>
<?php restore_current_blog(); ?>
で元のブログの状態に戻しましょうね、ということで最後に書いていたのですが、これが効かなかった。
上記では記事を3件取得しているのですが、親サイトに戻らず、2件目に取得された(つまり一つ前の)サイトの状態をrestore後に引き継いでいる様子。
最後の部分、こう直すとOKでした。
<?php wp_reset_postdata();?>
<?php restore_current_blog();?>
<?php endforeach;?>
</dl>
<?php endforeach; ?>
をうしろに持ってきたのですが、つまり<?php restore_current_blog(); ?>
はループ内に書かないといけないようです。
マルチサイトでいきましょうよ、と自ら提案したのを悔やまれるくらい今回の案件は苦労しました。。
でも初めてだったのでたくさん学習したぞ。次に活かすぞー。
コメントを残す