Blog

WordPressマルチサイトネットワークから新着記事を取得するコード(修正版)

Posted by admin at 4:47 日時 2011/08/28

#

[2013-07-15追記] WordPressマルチサイトからの記事の取得に関しては、WP Over Networkプラグインの開発協力という形で継続しています。そのため、当記事のコードはアップデートされません。最新版に対応した形で実現したい方は、WP Over Networkプラグインをお使いください。

WP Over Network をリリースしました。 | Foreignkey, Inc.


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( "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 );  	?>    	<!--?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’ );

今後のタスク

  • プラグイン化
  • 取得したデータのキャッシュをどこかに残しておく(この処理かなり重いので)

2013-01-28追記

トラックバックで教えていただいてコードを修正しました。

2013-02-12追記

アーカイブにも対応する、トラックバックをいただいたこちらのコードのほうがいいと思う。

WordPress のマルチサイトで、ネットワークブログの投稿を一覧表示する


Share this entry