WordPressプラグインのマルチサイト有効化の判定
※この記事は「テーマとかプラグインを作るときの、マルチサイトに対応するための判定のコード」をまとめています。
単に管理画面でマルチサイトの子サイト毎に個別のプラグインを有効化したい場合はこちらの記事を参考にどうぞ。
自分の持ってる別サイトでプラグインを開発しようとして、プラグインを触って使えるデモ用の環境を構築していた時の話。
このデモ用の環境を構築するためのベースとして使い慣れたマルチサイト機能を使用した。
以前会社に勤めていたときは、テーマの中で$blog_idをみてなんやかんやしていたのだが、マルチサイト化を行った後、さぁ次はいざプラグインを動かそうとした際に問題発生。
プラグインの有効化を判定するところのコード、具体的にはオプションの’active_plugins’で判定しているのが動かない。
Ash vs Evil Deadの主人公のように腐った俺の頭では気づくのに5分かかった。
まぁ普通に考えればわかるんだろうけど、マルチサイトではサイトごとにプラグインを設定できるわけだから、当然別の管理値を持っててしかるべきなんだよね。
そこで、MySQLを確認してマルチサイトのオプションを管理しているwp_sitemetaの中を物色。
・・・あるあるありましたよ。’active_sitewide_plugins’ってカラムが。
そこでMySQLの中身を見た情報を精査。
- プレーンの状態でマルチサイト化されておらずプラグインが有効化している状態→wp_optionsテーブルの’active_plugins’にプラグイン名が入る。
- マルチサイト化されていてネットワークでプラグインが有効化されている状態→wp_sitemetaテーブルの’active_sitewide_plugins’にプラグイン名が入る。
- マルチサイト化されていてネットワークでプラグインが無効化、個別のサイトで有効化されている状態→個別サイトのwp_optionsテーブルごとの’active_plugins’にプラグイン名が入る。wp_sitemetaテーブルの’active_sitewide_plugins’は当然なし。
- 個別サイトでのプラグインが有効化されており、後からネットワークでプラグインが有効化した状態→wp_sitemetaテーブルの’active_sitewide_plugins’、個別サイトのwp_optionsテーブルごとの’active_plugins’にプラグイン名が入る。
そこで以下の関数を作成。
function is_plugin_activate($plugin){ $option = get_option('active_plugins'); if(is_multisite() && !in_array($plugin, $option)){ $option = array_keys(get_site_option('active_sitewide_plugins')); } if(in_array($plugin, $option)){ return true; }else{ return false; } }
$pluginはキーワードとして設定するプラグイン名。
プラグイン名プラグイン名とさっきから言っているが「プラグインフォルダ/プラグインベースファイル.php」が実体となる。
こいつがプラグインを有効化した際に’active_plugins’とか’active_sitewide_plugins’に格納される。
マルチサイトが有効であっても$option=wp_optionsの’active_plugins’に当該のプラグイン名がなれば、$optionをwp_sitemetaの’active_sitewide_plugins’の値にするという寸法。
in_array()についてはとっても便利なPHP関数。大好き(はぁと)。でも説明は割愛。
マルチサイトでなかったり、wp_optionsの’active_plugins’にそもそも当該のプラグイン名が存在するのであればこの部分はスルーされ、冒頭で取得した値をそのまま使用。
そして、最後にベースとなった’active_plugins’か’active_sitewide_plugins’のオプションより$pluginの当該のプラグイン名があるかを判定。
これでないない状態でもいける。以上。
あ、肝心の用途忘れてた。
自分で制作するテーマや開発するプラグインをマルチサイト対応にするときや、既存のWordPressプラグインをキメラして全部他人製の自分のパッケージを作るときなどに使える・・・と思う。