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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

よく読まれている記事

タグリスト

Advanced Custom Fields bbPress Bogo CSS Googleストリートビュー https Instagram Graph API JavaScript jQuery Lazy Blocks Scratch ScratchJr Shopify Viscuit WordPress カスタムブロック サーバ サーバー ドメイン フリーランス プラグイン プログラミング教育 マルチサイト 仕事場 在宅