マルチサイトで動作検証してみた
リンクをカード形式で表示させるWordPressプラグイン「Pz-LinkCard Ver1.7.1.1」をWordPressマルチサイトで動作確認・動作検証してみました。
※この記事はPz-LinkCardを修正するにあたっての「覚え書き」という側面が強いので、読みやすいようには編集していませんが、同様のプラグイン作成者には参考になる可能性があります。
WordPressマルチサイトでの動作
WordPressには、WordPressを1つインストールしただけで複数の別のサイトを管理できる「マルチサイト」という機能があります。
直近のバージョンではだいぶ洗練されてきているようですが、通常のWordPressと違った注意点があったり、うまく動作しないプラグインがあったりすることから、自分も使ったことがありませんでした。
さて、当サイトでは「リンクをカード形式で表示するプラグイン Pz-LinkCard」を公開していますが、けっこうあちこちで使っていただき、中にはマルチサイトでも使用したいけどうまく動かないといった声がありました。
[link url=”http://www.forusoku.com/it/blog/wordpress/post-945″]
マルチサイト機能は知っていたものの、実際にその環境を作ったことが無かったので、「きっとマルチサイトでは不具合あるよなー」とは思っていましたが、一応動きはしているようなので、「思ったより対応してた!Σ(゚ロ゚)o゙」という感じです。
とりあえずどんな感じなのか分からないので、実際に環境を用意してみました。
マルチサイトを用意してみる
今のところ公開しているこのサイトと、開発・確認用のサイトが同じサーバーにあったので、色々テストをしていると公開している側も一緒に重くなってしまうことがあったので、「ロリポップ!レンタルサーバー」の月額250円の「ライトプラン」に契約してWordPressをインストール。
マルチサイト設定されたサイトを用意してみました。
超覚書き!Σ(゚ロ゚)o゙
- ロリポップ!レンタルサーバーでライトプランを契約する。
- 簡単インストールから「WordPress」をインストールする。
- FTPを開く。
- 「wp-config.php」のパーミッションが「400」になっているので「666」に変更。
- 「wp-config.php」にマルチサイト設定の行「define(‘WP_ALLOW_MULTISITE’, true);」を追加する。
- WordPress管理画面の「ツール」→「ネットワークの設置」を見ながら、「wp-config.php」と「.htaccess」を編集する。
- 「サイト」からテスト用サイトを追加していく。
こんな感じで用意しました。
[php title=”wp-config.php” start-line=”74″]define (‘WPLANG’, ‘ja’);
define(‘WP_DEBUG’, true);
define(‘WP_ALLOW_MULTISITE’, true);[/php]
言語設定の行の後ろにデバッグモードとマルチサイトの定義を追加。
公開するサイトはデバッグモードでは無い方が良いので、公開系の場合は「define(‘WP_DEBUG’, false);」にするか、この行を追加しない方が良いです。
自分はテスト用に用意した程度なので、詳しくは他サイトさんを検索されると良いと思います。
なお、下記サイトを参考にしました。
[link url=”http://webdesignerwork.jp/wordpress/multisite_blog/”]
[link url=”https://www.templateking.jp/practical/build/sub_dir.html”]
Pz-LinkCardのインストール
「サイトネットワーク管理者」のダッシュボード、「プラグイン」から「Pz-LinkCard」を検索して新規インストール。
「ネットワーク有効化」というのをすると、ぶらさがっているサイト全部でそのプラグインが有効化されるようです。
この「ネットワーク有効化」をしてみたところ、キャッシュ用のDBが用意されて、親サイト(メインサイト)では上手く動いたものの、子サイトを表示させたら「500エラー」(サーバーエラー)が発生してしまいました。
「ネットワーク停止」をしたあとに、「参加サイト」の各ダッシュボードで「有効化」を行ったところ、サイトごとにDBが作成されました。
プラグイン側では特に意識をしなくても有効化とかをしたサイトのDBが利用できるようです。
具体的には「$wpdb->prefix」をとったときに、たとえばDB接頭辞が「wp_」だった場合、メインサイトでは「wp_」、子サイトでは「wp_2_」「wp_3_」という値が戻ってきます。
「ネットワーク有効化」したときにはメインサイトと同じ「wp_」がとられてくるので、activate時にDBを生成している場合、1つしか用意されない結果になりました。
それぞれのサイトで有効化すると、それぞれのサイトでactivateが走るので、有効化時にDBが用意できるという感じです。
「ネットワーク有効化」した場合には自動的に「ネットワーク停止」して各サイトで「有効化」を促すメッセージが表示されると良いのですが、やり方がわかりませんでした。
マルチサイトが有効化になっているかどうかの判断
下記リンク先が詳しくて助かりました。
[link url=”http://nskw-style.com/2012/wordpress/ms/wpmu-global-variables.html”]
どうやら、WordPress関数の「is_multisite()」でマルチサイトが有効になっているかどうかの判断ができるようです。
[php]if ( is_multisite() ) {
echo ‘マルチサイトが有効です。’;
}[/php]
また、「is_main_site()」関数で、現在がメインサイトかどうかの判断ができるようです。
[php]if ( is_main_site() ) {
echo ‘現在、メインサイトで実行中です。’;
} else {
echo ‘現在、追加サイトで実行中です。’;
}[/php]
マルチサイトが有効で、メインサイトかどうかの判断は組み合わせることでできそうです。
「Pz-LinkCard」ではURLで自サイトの判断を行っているため、「サブディレクトリ型」を利用した場合にメインサイト以外の子サイトは「メインサイトの配下」になってしまい、記事IDが上手く取得できません。
メインサイトのときだけは記事IDが取得できなかったものは外部サイトと判断することで解決できそうな気がします。(2017/11/22 ver2.0.7 で対応しました)
[php]if ( is_multisite() ) {
if ( is_main_site() ) {
echo ‘マルチサイト有効かつメインサイトで実行中。’;
}
}[/php]
ただし、この方法だとカテゴリページやタグページ、トップページも記事IDが取得できないため、外部リンク扱いになってしまいます。(2017/8/1 ver2.0.1 で対応しました)
グローバル変数で実行中のサイトの判断
「$current_site」オブジェクトを参照すると「WP_Network Object」が返ってきます。
WordPressではサイトの集まりを「ネットワーク」と呼ぶようで、マルチサイト関連の機能が「ネットワーク設置」とか「ネットワーク設定」になっているようです。
つまり、「$current_site」は「現在のネットワーク」を取得できるようです。
マルチネットワークの機能は無いと思うので、将来拡張用かも知れません。
「current_site」じゃなくて「site_current」か「current_network」だったらもうちょっと分かり易かった気がします。
「$current_blog」オブジェクトを参照すると「WP_Site Object」が返ってきます。
同一「ネットワーク」配下のブログが「サイト」。つまりは「現在のサイト」が取得できるようです。
マルチサイトが有効化どうか、メインサイトかどうかは先ほどの関数で確認ができるので、グローバルを使う必要はあまり出てこないかも知れません。
むしろ、名前と実態がずれているので今後変更される可能性も…?
($WPMUクラスとかいうところで使ってるのかな?まあ、あんまり触りたいところでは無いですね…(^-^;)
get_optionとget_site_optionの違い
通常のシングルサイトであれば「get_option()」と「update_option()」、「delete_option()」でオプションの取得・更新・削除を行います。
「get_site_option()」と「update_site_option()」、「delete_site_option()」があるので、こちらがマルチサイト対応の関数かな?と思ったのですが、少々認識が誤っていました。
マルチサイトだとしても実行中のサイトの情報は「get_option」でそれぞれのサイトのオプションが取得できていました。
つまり、オプション取得に関してはマルチサイト対応は考慮しなくて良い感じです。
実際に格納されるDBはメインサイトならば「wp_options」(接頭辞が「wp_」の場合)、2つ目のサイト(1つ目の子サイト)ならば「wp_2_options」、3つ目のサイト(2つ目の子サイト)ならば「wp_3_options」といった感じです。
「get_site_option()」「update_site_option()」「delete_option()」の方は、「サイト」というか「ネットワーク」に対するオプションで、「wp_sitemeta」に格納されます。
どのサイトからアクセスしても同じ内容がかえってくるので、どのサイトでも設定を共有化したい場合は「get_site_option()」シリーズを使うと良いでしょう。
なお、シングルサイトで「get_site_option()」を使用すると「get_option()」の結果が戻ってくるようです。
この点、勘違いしていたため、マルチサイトで使用していた場合、Pz-LinkCard ver1.7.1からそれ以降に1.7.2に更新すると、いったん設定が初期化されます。ご了承ください…。
wp_upload_dir()も気にしないで良さそう
プラグインが格納されているディレクトリの中身は、プラグインを更新する度に一掃されます。
このため、スタイルシートを保存する場所として、プラグインのディレクトリは使用せず、アップロードディレクトリを使用しています。(画像などが保存されているディレクトリ配下)
これを取得するために「wp_upload_dir()」関数を使用しているのですが、メインサイトでは「/wp-content/uploads」が返され、2つ目のサイト(1つ目の子サイト)では「/wp-content/uploads/sites/2」が返され、3つ目の子サイト(2つ目の子サイト)では「/wp-content/uploads/site/3」が返されるので、プラグイン内では意識せずにディレクトリを分けてくれます。
テーマとプラグインをインストールする場所は共有されているので、「plugin_basename()」「plugin_dir_path()」「plugin_dir_url()」はどのサイトから見ても同じものが入っているようです。
テーマをサイトごとにカスタマイズしたいときは「子テーマ」をインストールして、それぞれのサイトにはそれぞれの子テーマを有効化すると良いでしょう。
プラグインをサイトごとにカスタマイズすることは少ないと思いますが、この場合には別ディレクトリに別プラグインとして名前を変更しておく必要があります。
まとめ
マルチサイトを意識して有効化(アクティベート)処理から停止(ディアクティベート)、削除(アンインストール)までを完全対応させるのはちょっと大変かなぁという気がしました。
とはいえ、基本的なWordPress関数を使っている限り、マルチサイトを意識しなくてもほとんどのプラグインはそのまま動作することが分かりました。
Pz-LinkCardも思ったより普通に動きそうということが分かりました。
ということで、「Pz-LinkCard」をマルチサイトで使用するにあたっての注意点です。
- 有効化時にDBと初期設定を行うので各サイトから有効化する。
- すでに「ネットワーク有効化」してしまった場合は、いったん「ネットワーク停止」してから、利用したい各サイトのプラグイン画面で「有効化」していく。
- 設定はサイト毎に保存されるため、書式などもサイト毎になる。(ver1.7.1は不具合があるため、1.7.2以降で対応予定)
- 記事内容をキャッシュしているDBも共有されずサイト毎になる。(キャッシュデータは共有するのがデータ節約になるとも思いましたが、「表示する抜粋文をサイトごとに分けたい場合」に対応できなくなるので、このままで良いと思います。)
- URLの前方一致で内部リンクの判定を行っているため、サブディレクトリ式の場合は、子サイトは親サイトから見て内部サイトと判断されてしまう。
- 子サイトから見ると「メインサイト(親サイト)」と他の「子サイト」は外部サイトになります。(URL前方一致のため)
- サブドメイン方式ではURLがそもそも違うため、内部リンクと外部リンクの判断も正しく行えると思います。
一番大きいところはネットワーク管理者のダッシュボードのプラグイン画面から「ネットワーク有効化」しないところ。
メインサイトは上手く動いているようでも、子サイトはDBアクセスに失敗するためサイトそのものがうまく表示されなく場合があります。
「ネットワーク有効化」してしまっても、「ネットワーク停止」をしてから各サイトで有効化すれば大丈夫そうです。
DBの削除は「停止」時では無く、アンインストール時なので、メインサイトの分しか削除を考慮していません。
子サイトのキャッシュは「(接頭辞)_pz_linkcard」というテーブルが残ってしまいますので、気になる場合は手動で削除するしかありません。
プラグイン停止時にDBを削除してしまうと、不具合対応などで一時的にプラグインを停止したときに多量のキャッシュを失うこととなってしまうため、このタイミングは仕様です。
アンインストール時にマルチサイトの場合は消すようにすると良いのですが、不具合出すと返って大変なことになるので対応はまたいずれ…?
「マルチサイトで使用するとこんな不具合があった!」など、情報があれば、コメントやツイッターでお知らせいただけると嬉しいです。
また、過去バージョンでは上手く取得できていなかったものも最新バージョンでは取得できたりする可能性があるので、管理画面で再取得するか、キャッシュを削除してみてください。
では、この辺で。(^-^)o
↓続き
[link url=”https://popozure.info/20161230/10886″]