WordPressプラグインをマルチサイトに対応させるためのテストと結果をメモします。
前回は
少し前に、リンクをカード形式で表示させるWordPressプラグイン「Pz-LinkCard」をマルチサイトで動かしてみました。
マルチサイト対応に向かって、もう少しあれこれテストしてみます。
テストプログラム1
アクティベーションしたときに、マルチサイト向けの変数などで、「ネットワーク有効化」されたのか、各ブログで有効化されたのかを検知できるか試してみる。
テストプログラムのアクティベーション時に呼ばれるサブルーチンはこんな感じ。
public function activation() { echo 'activation<br>'; echo 'is_multisite()='.is_multisite().'<br>'; echo 'is_main_site()='.is_main_site().'<br>'; global $current_site , $current_blog , $blog_id; echo 'current_site='.$current_site.'<br>'; echo 'current_blog='.$current_blog.'<br>'; echo 'blog_id='.$blog_id.'<br>'; }
結果はこんな感じ。
is_multisite() | is_main_site() | |
ネットワーク有効化 | 1 | 1 |
メインサイト | 1 | 1 |
サブサイト1 | 1 | null |
サブサイト2 | 1 | null |
「ネットワーク有効化」したときと、メインサイトで「有効化」したときの違いは分からなかった。
グローバル変数の「$current_blog」と「$blog_id」の組み合わせも試してみた。
activation is_multisite()=1 is_main_site()=1 current_site= WP_Network Object ( [id:WP_Network:private] => 1 [domain] => application.secret.jp [path] => / [blog_id:WP_Network:private] => 1 [cookie_domain] => application.secret.jp [site_name] => マルチサイトのテスト ) current_blog= WP_Site Object ( [blog_id] => 1 [domain] => application.secret.jp [path] => / [site_id] => 1 [registered] => 2016-08-20 17:04:05 [last_updated] => 2016-08-31 13:01:22 [public] => 0 [archived] => 0 [mature] => 0 [spam] => 0 [deleted] => 0 [lang_id] => 0 ) blog_id=1 |
グローバル変数の「$current_site」は現在の「WP_Network Object」という表示どおり、「サイトネットワーク番号」を返す。複数のネットワークは実装されていないため、今のところ値は変動しないっぽい。
グローバル変数の「$current_blog」は「WP_Site Object」。現在の「サイト情報」を返す。
表示された内容だと、ネットワーク有効化したときと、メインサイトで有効化したときとで見分けられない気がした。
テストプログラム2
アクティベーションしたときに、update_site_optionとupdate_optionでオプションを設定して、どんな風に設定されたかで「ネットワーク有効化」されたのか子サイトで有効化されたのか検知してみようと思う。
テストプログラムのアクティベーション時に呼ばれるサブルーチンはこんな感じ。
public function activation() { echo 'activation<br>'; $this->options = get_site_option('pz_test_options', null ); $this->options['active'] = 1; update_site_option('pz_test_options', $this->options); $this->options = get_option('pz_test_options', null ); $this->options['active'] = 2; update_option('pz_test_options', $this->options); }
結果としては、site_optionはサイト全体で共通のオプションで、シングルサイトのときはoptionをアクセスするけど、マルチサイトのときはoptionとは別扱い。
optionは各サイトのオプションだけど、「ネットワーク有効化」のときはメインサイト扱いだった。
そっちじゃない「ネットワーク有効化のみ」設定
プラグインのプログラムのヘッダー部に「Network: true」と記述すると、ネットワーク有効化のみができるようになり、サイトごとに有効化ができなくなります。
<?php /* Plugin Name: Pz-Test Plugin URI: https://popozure.info Description: Version: 0.0.1 Network: True Author: poporon Author URI: https://popozure.info License: GPLv2 or later */ defined('ABSPATH') || die;
「false」にすると各サイトでも有効化できるようになるだけで、「ネットワーク有効化」だけを禁止する記述は分かりませんでした。
収穫なしという収穫
理想としては「ネットワーク有効化」したときは、どのサイトからも同じキャッシュテーブルを利用して、各サイトから「有効化」したときは、それぞれのキャッシュテーブルを利用するという感じでした。
アクティベーション時にはupdate_site_optionでサイトオプションを保存しておいてDBのテーブル名も保存しておいて、普段はget_optionして見つからなかったらget_site_optionする感じにすれば実現できそうですが、マルチサイト向けのコードを沢山書くと、WordPressの仕様変更時の対応に追われそうです。
当面、「Pz-LinkCard」のマルチサイト正式対応は厳しいという状態で、各サイトごとに有効化するのをお勧めとしようと思います。→ver2.0.7で対応しました。
DBアクセスに失敗したらactivateのルーチンをまわすくらいの対応は考えたいと思います。→ver2.0.0で対応しました。
では、この辺で。(^-^)o
コメント