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 のマルチサイトで、ネットワークブログの投稿を一覧表示する