#WordPress マルチサイトネットワーク内の全ブログの新着記事を表示する方法
Posted by admin at 11:22 日時 2011/02/18
[2013-07-15追記] WordPressマルチサイトからの記事の取得に関しては、WP Over Networkプラグインの開発協力という形で継続しています。そのため、当記事のコードはアップデートされません。最新版に対応した形で実現したい方は、WP Over Networkプラグインをお使いください。
WP Over Network をリリースしました。 | Foreignkey, Inc.
[2011-08-28追記] 修正版をアップしました。
WordPress3.0以降で標準で使える様になった、複数のブログをひとつのWordPressで管理できるネットワーク(マルチサイト)機能。ネットワーク内の各サイトの新着情報を親サイトで表示したい!という要望がありそうなものですが、該当するテンプレートタグは見当たらなかったので自作しました。
方針
ネットワーク内の全ブログから最新1件の投稿データを取得し、時系列で並び替える。
最新1件しか取得しないのは、WordPressの設計上、各ブログのデータベースが分かれているため全記事の新着を表示する処理は重くなるということと、よく更新するブログばかりトップページに出てくるのを防ぐため。
関数をfunctions.phpに追加する
以下のコードをお使いのテーマのfunctions.phpの末尾にコピペして保存してください。
// $startを1以上にすると最新のn件を飛ばして取得できます // $numで取得する件数を指定。 function get_recentposts_from_network( $start = 0, $num = 10 ) { $recent_posts = get_site_option("network_recentposts"); // データが残っていない場合、60秒以上経過している場合はアップデートする if( is_array( $recent_posts ) ) { if( ( $recent_posts['time'] + 60 ) < time() ) { // cache for 60 seconds. $update = true; } } else { $update = true; } if( $update == true ) { unset( $recent_posts ); // 全ブログのIDを取得 $blogs = get_blog_list( 0,'all' ); if( is_array( $blogs ) ) { reset( $blogs ); // 各ブログの最新1件を取得する foreach( $blogs as $blog ) { switch_to_blog( $blog['blog_id'] ); $posts = get_posts( 'numberposts=1' ); if( $posts ) { foreach( $posts as $post ) { $recent_posts[$blog['blog_id']] = $post->post_date; $post_list[$blog['blog_id']] = $post; } // endforeach unset( $posts ); } // endif ( $posts ) restore_current_blog(); } // endforeach // 投稿日時で並べ替える arsort( $recent_posts ); reset( $recent_posts ); foreach( (array) $recent_posts as $key => $details ) { $t[$key] = $post_list[$key]; } // endforeach unset($recent_posts); $recent_posts = $t; update_site_option( "network_recentposts", $recent_posts ); } //endif ( is_Array( $blogs ) ) } // endif ( $update == true ) if( $recent_posts ) return array_slice( $recent_posts, $start, $num, true ); return array(); }
テーマ内で表示する
関数からの返り値には、ブログIDをキーとした配列に、各投稿のデータが入っています。switch_to_blog()でブログをスイッチしてからsetup_postdata()で投稿データをセットアップすると、テンプレートタグが普通に使える様になります。あとはお好みでどうぞ!ブログをスイッチしたあとは、restore_current_blog()で戻すのをお忘れなく。
使用例
<?php $network_posts = get_recentposts_from_network( 0, 5 ); if( $network_posts ) : ?> <ul> <?php foreach( (array) $network_posts as $blog => $post ) { switch_to_blog( $blog ); setup_postdata( $post ); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php restore_current_blog(); } wp_reset_query(); ?> </ul> <?php endif; ?>
この関数を使えば、ネットワーク全体のRSSフィードを作成することもできます(面倒だけど)。
WPMUをずっと使ってこられた方なら、別のいい方法を知ってるのかもしれないです