WordPressをマルチサイトにする(テンプレート編)
マルチサイト化したWordPressのテンプレートの制作、テンプレート構造、テンプレートの分岐などを解説します。
ワードプレスをマルチサイトでインストール、設定が完了したら、親・子サイトのテンプレートを制作していきます。
各サイトのヘッダーやフッターが共通する場合は、親となるテーマのテンプレートだけに「header.php」「footer.php」を用意します。
テンプレートのディレクトリ構造は下記になります。
小テーマのテンプレートにheader.phpがあれば、そのテンプレートが読み込まれます。
header.phpが親テーマにしかなければ、小ブログは親テーマのheader.phpを読み込みます。
メンテナンスしやすいテンプレート構造
テンプレートのメンテナンスや運用効率を考えると、親となるテーマにはヘッダーやフッター、モジュールとして使うパーツなど、各サイトで共通して使い回すファイルのみにしたほうがメンテナンス性は高くなります。
関数の分岐を利用して各サイトごとに表示を変更させることもできますが、分岐を使いすぎるとメンテナンス性が悪くなる場合もあります。
分岐はほどほどにして、子テーマを活用する方がメンテナンスや運用効率は高くなります。
親子テーマのスタイルシートの記述
子テーマのスタイルシートの「Template」に親テーマと同じテンプレート名を記載することで、テンプレートの親子関係が成立します。
CSS
Template:original ←親子共通のテンプレート名にする
Theme Name:original-child
Theme URI:https://www.itti.jp/blog/
Description: サイト用の小テーマ
テーマを使う方法
アップロードしたテーマを使うには、コントロールパネルの「テーマ」で、有効化すると使えるようになります。
マルチサイトでよく使う関数
サイトのIDで分岐したり、小サイトの記事を表示させたり、マルチサイトでよく使う関数です。
サイトIDで条件分岐させて表示させる
条件分岐を使って、サイトごとに表示を変更させます。
PHP
<?php
global $current_blog;
$blog_id = $current_blog->blog_id;
if ($blog_id == 1):
?>
サイトIDが1の場合
<?php elseif ($blog_id == 2): ?>
サイトIDが2の場合
<?php else: ?>
それ以外のサイトの場合
<?php endif; ?>
他のサイトの情報を読み込む
親サイトに小サイトの記事を表示させる時などに利用されます。
関数の「switch_to_blog」でブログを指定して情報を取得します。
サイト2の記事を10件取得した場合
PHP
<?php switch_to_blog(2) ?> //ブログIDが2の情報を取得
<?php
$posts = get_posts(array(
'posts_per_page' => 10, // 記事の取得件数
));
foreach ($posts as $post): setup_postdata($post);
?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; ?>
<?php restore_current_blog(); ?>//リセットする
各サイトの記事を5件づつ表示した場合
「wp_get_sites」でブログIDを取得して「foreach」でまわします。
PHP
<?php
$my_blogs = wp_get_sites();
foreach ( $my_blogs as $blog ):
switch_to_blog( $blog['blog_id'] );
?>
<h2><?php bloginfo(name); ?></h2>
<ul>
<?php
$args = array( 'posts_per_page' => 5);
$myposts = get_posts( $args );
foreach($myposts as $post) :
setup_postdata($post);
?>
</li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php the_content(); ?>
</li>
<?php endforeach; ?>
</ul>
<?php
restore_current_blog();
endforeach;
?>
カスタムタクソノミーの情報を取得して表示
小サイトのカスタムタクソノミーを取得する場合「switch_to_blog()」「WP_Query」だけでは情報を取得することはできません。
表示させるサイトにも同じカスタムタクソノミーを設定する必要があります。タームまで設定する必要はありません。
表示させるサイトにタクソノミーを設定してから、下記のコードで記事をカスタムタクソノミーの記事を取得します。
PHP
<?php switch_to_blog(2); ?>
<?php
$args = array(
'post_type' => 'post',
'taxonomy' => 'taxonomy_name', //特定のカスタムタクソノミを指定
'field' => 'slug',
'term' => 'term_slug' //特定のタームのスラッグを指定
'posts_per_page' => 5
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<h3><?php the_title(); ?></h3>
</a>
</li>
<?php endwhile; endif; ?>
<?php restore_current_blog(); ?>
メイン(親)のURLを取得する
メイン(親)のURLを取得することができます。
PHP
<?php echo network_home_url(); ?>
サイトの情報を取得する関数
関数「get_blog_option()」で子サイトのタイトルや、URLなどの情報を取得することができます。
PHP
<?php get_blog_option($blog_id, $setting, $default); ?>
サイトID2のブログ名を取得する場合は下記になります。
PHP
<?php get_blog_option(2, 'blogname'); ?>
get_blog_optionについてはcodexで詳しく書かれています。
以上、WordPressのマルチサイトのメリットから構築方法、テンプレート制作でした。
マルチサイトは複数のブログを統合管理できるため便利ですが、カスタム投稿やカテゴリーを使ってシングルサイトでも対応できるかを検討したほうが良いです。