【WordPressマルチサイト攻略】別サイトの情報をスマートに呼び出す「横断取得」完全ガイド

WordPress

せっかくWordPressをマルチサイトにしたのだから、情報リンク使いしないともったいない!

WordPressマルチサイトの最大の利点は、単にサイトを複数持てることではない。
サイト間の壁を越えて、情報を自由に流通させられること」にある。

「サイトAの新着記事をサイトBのトップに表示したい」
「ネットワーク全体の統計を出したい」
これらはすべて、標準関数を使えばプラグインなしで実現可能!!

親切盛りすぎて重くなってる過剰親切の公開プラグイン様に頼りたくない方は、自分でシンプルに作ってみるがよろしいかと。

使いたいブログIDを指定することで対応可能

どうやって表示するブログを操作するかっていうと、ブログID(BLOG_ID)を、内部的に詐称するんですねー。

まず、ブログIDについて説明をすると
ブログIDというのは、何個目のブログなのかを示すID。
通常(シングル)のWordPressではブログIDは常に1。

IDの調べ方

「ネットワーク管理画面」➔「サイト」➔「すべてのサイト」
にて、サイト名の上にマウスホバーするとURLにid=2のように表示されます。

この『2』の部分がブログID。
これを使えば、参加サイトの情報表示することができるわけですな。

PHP内でURLからブログIDを取得し方

手作業ではなくて、PHP内でURLから何とかしたいって場合もあるかと。

そんなときはget_blog_id_from_url()を使う。
ドメインやパス(URL)から対応するブログIDを逆引きする関数。

$url = 'example.com/sub-site/'; // 例えばURLが⇦なら、指定は⇩
$blog_id = get_blog_id_from_url( 'example.com', '/sub-site/' );

第二引数($path)はデフォルト『/』なので、指定しなくてもOK。

サイトを跨ぐ基本:switch_to_blog()

指定したブログIDの情報を一時的に取得したい場合に使う。

<?php
$target_blog_id = 2; // 切り替えたいサイトのブログID

// サイトBに切り替え
switch_to_blog( $target_blog_id );

// ここからはサイトBの関数として動く
$latest_posts = get_posts( array( 'posts_per_page' => 5 ) );

foreach ( $latest_posts as $post ) :
    setup_postdata( $post );
    echo '<li>' . get_the_title() . '</li>';
endforeach;
wp_reset_postdata();

// 【重要】元のサイトに必ず戻す
restore_current_blog();
?>

【必須】サイト戻し:restore_current_blog()

switch_to_blog() を呼んだら、必ずセットで restore_current_blog() を実行すること。
これを忘れると、その後のウィジェット、メニュー、クエリすべてが切り替え先のサイトになる。
見た目・内容ともに、キメラ状態で非常に気持ち悪い。

切り替えずにデータを取る:get_blog_option()

特定のサイトのオプション(サイトタイトルやメールアドレスなど)を指定して取得できる。

// ブログIDが3 のサイト名と管理者メールアドレスを取得
$blog_name = get_blog_option( 3, 'blogname' );
$admin_email = get_blog_option( 3, 'admin_email' );

switch_to_blog よりもオーバーヘッドが少なく、コードが簡潔になる。
何よりわかりやすい。

「サイト名さえあればいい」という場合は、これをオススメする。

サイトの素性を知る:get_blog_details()

ネットワーク内の特定のサイトが「どんな設定か」をオブジェクトで取得する。

// ブログIDが2の場合
$details = get_blog_details( 2 );
echo $details->blogname; // サイト名
echo $details->siteurl;  // URL
echo $details->path;     // パス

サイト一覧ページや、サイトごとのリンク集を作る際に重宝する関数。
1個1個ブログIDを指定しなくていいから、指定を間違えにくくてよろしい。

応用編:全サイトをループで回す

ネットワーク内の全サイトから情報を集めたい場合は get_sites() を入り口にする。

$sites = get_sites( array( 'number' => 10 ) );

foreach ( $sites as $site ) {
    switch_to_blog( $site->blog_id );
    // 各サイトでの処理を書く
    restore_current_blog();
}

状態確認:現在使っているブログIDを確認

switch_to_blog と restore_current_blog の対応が崩れて
「今どっちのサイトのDBを見てるんだっけ?」
というパニック状態に陥ったとき用の対応。

// もし、今「切り替わった状態」なら、安全に元のサイトへ戻す
if ( ms_is_switched() ) {
    restore_current_blog();
}

トランスジェント(キャッシュ)活用のすすめ

別サイトの情報を取得するのは、実はコストが高い。
毎回 switch_to_blog でDBを切り替えてクエリを投げるのは、サーバーへの負担が大きいので。

そこで、取得したデータを一時的に保存(キャッシュ)しておくのが「トランスジェントAPI」。

⇩「サイトBの最新記事5件」を取得する場合の例

$cache_key = 'my_network_site2_latest_posts'; // キャッシュに名前をつける
$cached_data = get_transient( $cache_key );

if ( false === $cached_data ) {
    // キャッシュがなかったら、重い処理(切り替え)を開始
    switch_to_blog( 2 );
    
    $query = new WP_Query( [ 'posts_per_page' => 5 ] );
    $cached_data = $query->posts; // 投稿データだけを抜き出す
    
    restore_current_blog();

    // 結果を1時間(3600秒)保存する
    set_transient( $cache_key, $cached_data, 3600 );
}

// あとは $cached_data を使って表示するだけ
foreach ( $cached_data as $post ) {
    echo $post->post_title;
}

あとは作るだけ!

コレだけあればまぁ、大体なんとかなるので、作ってみてくださいね!

開発環境で本番サイトをみたいだけの場合

一部を取得とかそういうんじゃなくて、
本番マルチサイトWordPressを、ローカル開発環境で表示・確認する方法が知りたい場合はコチラ⇩

【WordPress】本番マルチサイトをローカル開発環境で表示・確認する方法
開発環境でマルチサイト環境の本番WordPress表示させたい通常のシングルサイト状態なら確認できる。でもマルチサイトになると偽造しきれなくて、延々ループする。「でも何とか、データ変更することなく、開発環境で見たい!」て人のための対応方法

コメント

タイトルとURLをコピーしました