WordPress 3.7で追加された wp_get_sites をちょっとみてみた

WordPress 3.7でマルチサイトの情報が取得できる wp_get_sites というのが追加されたみたいなのでちょっとみてみました。

英語のCodexには追加されてました。Function_Reference/wp_get_sites
ふむふむ。

とりあえず使ってみる

とりあえず、マルチサイトのブログを作って、

<?php 
$my_sites = wp_get_sites(); 
var_dump($my_sites);
?> 

してみると、こんな感じで情報が取得出来ました。

array(5) {
  [0]=>
  array(12) {
    ["blog_id"]=>
    string(1) "1"  //ブログのID
    ["site_id"]=>
    string(1) "1"  //サイトのID
    ["domain"]=>   
    string(8) "wp371dev"   //ドメイン
    ["path"]=>
    string(1) "/"   //サイト(ブログ)のパス
    ["registered"]=>
    string(19) "2013-11-17 16:13:58"   //登録日
    ["last_updated"]=>
    string(19) "0000-00-00 00:00:00"   //最終更新日
    ["public"]=>
    string(1) "1"   //「公開」されてるか
    ["archived"]=>
    string(1) "0"   //「アーカイブ化」されてるか
    ["mature"]=>
    string(1) "0"   //「成人向け」か
    ["spam"]=>
    string(1) "0"   //「スパム」か
    ["deleted"]=>
    string(1) "0"   //「削除」か
    ["lang_id"]=>
    string(1) "0"   //言語
  }
 [1]=>
  array(12) {
    ["blog_id"]=>
    string(1) "2"
    ["site_id"]=>
    string(1) "1"
    ["domain"]=>
    string(8) "wp371dev"
    ["path"]=>
    string(9) "/child01/"
    ["registered"]=>
    string(19) "2013-11-17 16:18:07"
    ["last_updated"]=>
    string(19) "2013-11-17 07:18:10"
.
.
.
.
.

publicからdeletedまではサイトネットワーク管理者の管理画面 > サイト > サイトの編集 の属性を表示してるみたいですね。

パラメーター

使えるパラメーターは

'network_id' => $wpdb->siteid,
    'public'     => null,
    'archived'   => null,
    'mature'     => null,
    'spam'       => null,
    'deleted'    => null,
    'limit'      => 100,
    'offset'     => 0,

wp_is_large_network がTRUEのとき(10,000サイト以上!!)は空の配列が返ってくるそうです。

wp_is_large_network というのも3.7で追加された関数です。

ネットワーク上のブログのIDを取得

ネットワーク上のブログのIDを取得して表示してみます。

<?php
$blog_ids = wp_get_sites(); 

foreach ( $blog_ids as $blog ):
   
  echo ($blog['blog_id']);
 
endforeach;
?>

「123456..」という感じでIDが表示できました。

ネットワーク上のブログのタイトルを表示

IDがわかればブログの情報が取得出来ますね。

switch_to_blog() を使ってネットワーク上のブログのタイトルを表示してみます。
restore_current_blog()を忘れちゃうと、switch_to_blogしたブログのままになっちゃうので注意です。

<?php

$my_blogs = wp_get_sites(); 
foreach ( $my_blogs as $blog ):
    switch_to_blog( $blog['blog_id'] );
?>
<h2><?php bloginfo(name); ?></h2>

<?php
    restore_current_blog();
endforeach;
?>

ネットワーク上のブログのタイトルと記事を表示

ここまで出来たら各サイトの新着記事をループして表示すればいいので

<h1>サイトの更新情報</h1>		
<?php

$my_blogs = wp_get_sites(); 
foreach ( $my_blogs as $blog ):
    switch_to_blog( $blog['blog_id'] );
?>
<h2><?php bloginfo(name); ?></h2>

	<?php
		$args = array( 'posts_per_page' => 5);
		$myposts = get_posts( $args );
		foreach($myposts as $post) :
		setup_postdata($post);
	?>
	<article>
		<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><h2>
		<?php the_content(); ?>
	</article>
		<?php endforeach; ?>
		

<?php
    restore_current_blog();
endforeach;
?>

こんな感じで各サイトの新着5件が表示できますね。

テンプレートタグでIDを取得できるようになって、switch_to_blog 、ちょっとだけ使いやすくなったのでしょうか?
offset以外に並び替えとか除外とか、パラメータが増えたらいい感じかも。
並び替えとか除外とか、やってみようかなーと思ったけど今回は挫折。

そして、やっぱり全部のブログから新着5件表示、というようなのはまだまだ簡単にできるようにならないみたいですね。ざんねん。

コメントをどうぞ♪