【WordPress・マルチサイト】restore_current_blog()が効かないのは記述位置の問題だった

マルチサイトの親サイトに、親・子サイトの投稿を混ぜて一覧表示させるというもの。
いろいろなサイトを参考に、親サイトの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(); ?>はループ内に書かないといけないようです。
マルチサイトでいきましょうよ、と自ら提案したのを悔やまれるくらい今回の案件は苦労しました。。
でも初めてだったのでたくさん学習したぞ。次に活かすぞー。

コメントをどうぞ!

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。承認制のため、反映まで時間がかかることがあります。

CAPTCHA