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