マルチサイト化した WordPress は、各サイトにサイトIDが割り振られています。
このIDと switch_to_blog() 関数を使うことで、ほかの兄弟サイトのデータにアクセスできるようになり、例えば、ホームページとブログを兄弟サイトにしてたときにホームページ側にブログの記事を表示したりとかといったことができるようになります。
で、今回の案件であったんですが、もう各サイトのパスは決まっているんだけど、作る順番が曖昧でIDで指定してしまうとうまくスイッチできない可能性があるといった状況で狙ったブログにスイッチさせなくてはイケないという状況になりまして、なんとかならないか考えてみました。
定義済みのサイトを取得するには wp_get_sites()
WordPress 3.7 以降では、wp_get_sites() という関数を使うことで、定義されているサイトのデータをまるっと取り出すことができます。
$sites = wp_get_sites(); var_dump($sites); ↓ array(6) { [0]=> array(12) { ["blog_id"]=> string(1) "1" ["site_id"]=> string(1) "1" ["domain"]=> string(7) "example.dev" ["path"]=> string(1) "/" ["registered"]=> string(19) "2015-03-16 08:59:47" ["last_updated"]=> string(19) "2015-07-09 10:29:45" ["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(7) "example.dev" ["path"]=> string(4) "/blog/" ["registered"]=> string(19) "2015-03-20 09:54:48" ["last_updated"]=> string(19) "2015-03-20 09:54:48" ["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" } // 以下略 }
あとはこれをループに放り込んでごにょごにょすれば…
foreach ($sites as $index => $site) { if ($site['path'] == '/blog/') $site_blog_id = $sites[$index]['blog_id']; } var_dump ($site_blog_id); ↓ string(1) "2"
無事IDが求まりました。
あとは適当に関数とかにしておけばいいんじゃないんすかね?
function get_site_id_by_path($search_path) { $result_id = false; $sites = wp_get_sites(); foreach ($sites as $index => $site) { if ($site['path'] == '/'.$search_path.'/') $result_id = $sites[$index]['blog_id']; } return $result_id; } // テスト var_dump(get_site_id_by_path('blog')); ↓ string(1) "2"
これでいつでもパスからIDを探せますね。
頻繁にスイッチするならさらに switch_to_blog() のラッパー関数でもつくってパスからスイッチできるようにしてもいいかもしれません。まぁ switch_to_blog(get_site_id_by_path(‘blog’)); とかで十分かもしれませんが