
WordPressをネットワーク化し、1つのWordPressで複数のサイトを管理している際に、ネットワーク全体の新着記事を表示するためのコードです。以前ブログに投稿したコードがありますが、get_blog_list()がWordPress3.0から非推奨になったため、get_blog_list()を使用しないように変更した修正版です。
また、各サイトから1件を取得して並び替える実装だったのですが、各サイトからの取得件数を指定できるようにしました。
下記のコードをお使いのテーマのfunctions.phpに追加することで、使うことができるようになります。
function get_recentposts_from_network( $args = null ) {
$defaults = array( 'num' => 10, 'perblog' => 1, 'start' => 0 );
$r = wp_parse_args( $args, $defaults );
// 全ブログのBLOG_IDを取得
global $wpdb;
$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id FROM wp_blogs ORDER BY blog_id" ) );
if( is_array( $blogs ) ) { reset( $blogs );
// 各ブログの最新記事を指定件数取得する
foreach( $blogs as $blog ) {
switch_to_blog( $blog->blog_id );
$posts = get_posts( "numberposts=" . $r['perblog'] );
if( $posts ) {
foreach( $posts as $post ) {
$recent_posts[] = $post->post_date;
$post->blog_id = $blog->blog_id;
$post_list[] = $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;
} //endif ( is_array( $blogs ) )
if( $recent_posts )
return array_slice( $recent_posts, $r['start'], $r['num'], true );
return array();
}
テーマ内での使い方
上記のコードをfunctions.phpに追加することで、get_recentposts_from_network関数が使えるようになります。if( $network_posts ) から setup_postdata( $post ); まで、restore_current_blog(); から endif; までは、WordPressのループと同様、とりあえずこういうものだと思ってください。the_permalink(); などのテンプレートタグは使えます。
<?php
$network_posts = get_recentposts_from_network( 'perblog=3' );
if( $network_posts ) :
foreach( (array) $network_posts as $key => $post ) {
switch_to_blog( $post->blog_id );
setup_postdata( $post );
?>
<li><a href="<?php the_permalink() ;?>"><?php the_title(); ?></a></li>
<?php
restore_current_blog();
}
wp_reset_query();
endif;
?>
パラメータ
- num : 表示件数(初期値 = 10)
- perblog : 各ブログから取得する記事件数(初期値 = 1)
- start : 表示を開始する投稿数(初期値 = 0)
各ブログから新着記事を5件ずつ取得
$network_posts = get_recentposts_from_network( ‘perblog=5′ );
最新の1件を飛ばして20件表示
$network_posts = get_recentposts_from_network( ‘num=20&start=1′ );
今後のタスク
- プラグイン化
- 取得したデータのキャッシュをどこかに残しておく(この処理かなり重いので)
関連する記事:
- #WordPress マルチサイトネットワーク内の全ブログの新着記事を表示する方法
- #WordPress ネットワーク内の別ブログの新着情報を表示するウィジェット
- WordPressのデフォルトの検索をカスタマイズする
- WordPressで複数のカスタム属性をミックスしたタグクラウドを表示する
関連記事はYARPP関連記事プラグインによって表示されています。

Pingback: #WordPress マルチサイトネットワーク内の全ブログの新着記事を表示する方法 | 神戸のフリーランスWebマスターの日報
Pingback: #WordPress マルチサイトネットワーク内の各ブログから最新の投稿1件を取得し時系列で並べる方法 | umbrella_process blog
Pingback: WordBeachに参加してきました | 神戸のフリーランスWebマスターの日報