マルチサイト機能でメインサイト(blog_id:1)のpluginが個別で有効にならない

マルチサイト状態では、サイト毎個別に有効化できない

マルチサイト機能を使うと、メインサイト(blog_id:1)のプラグインを、個別に有効化できない!
子サイトは、全てちゃんと、サイトごとにプラグインが有効になる。
サブディレクトリタイプでもマルチドメインタイプでも同じ状態。

どうしてこうなるのかと、とりあえずの対応について、書いておきます。

個別でプラグインを『有効化できない』ではなく『有効と認識しない』!

マルチサイト状態でプラグインは、

  • 全サイトに適用する『サイトネットワークで有効化』
  • サイト毎に個別に適用する通常の『有効化』

がある。

大概サイトネットワークで有効化できるのだが、たまに『個別に適応』しないといけないプラグインがある。
そこで気づいたのだが、メインサイト(blog_id:1)でのみプラグインを有効化しても有効にならない状態だった。

認識しない状態について

  1. 他の子サイトは、全てキチンと有効化になる。
  2. サブディレクトリタイプでもマルチドメインタイプでも同じ状態。
  3. マルチサイト機能を使うためのプラグインを、全部切ってみても状態が変わることはない。

プラグインの情報が入っているDBテーブル『wp_options』のoption_name=『active_plugins』。
確認してみたところ、ちゃんと有効化させたプラグイン情報が入っていた。

なのに、関数から取得しようとすると、空が返ってくる。
個別で有効プラグイン情報は『get_option( 'active_plugins', array() )』という関数で、ネットワークでの有効プラグイン情報は『get_site_option('active_sitewide_plugins')』。
因みに個別は空、ネットワークはちゃんと値が返ってくる。

『wp-includes/option.php』の『get_option()』が怪しい

『wp-includes/option.php』の『get_option()』内にて

		$notoptions = wp_cache_get( 'notoptions', 'options' );

		if ( isset( $notoptions[ $option ] ) ) {

で『active_plugins』がある認定されるんだけど

			return apply_filters( "default_option_{$option}", $default, $option, $passed_default 

で返ってくる値が空。

apply_filtersはadd_filterを呼び出すための関数。
『$value』を返した結果、空。
blog_id:1の場合だけ空。empty。悲しい。

『add_filter( "default_option_active_plugins"』はを登録してないのは何でなん?
『register_setting()』してる? よね? だから1以外は出来てるもんね! ん?

メモ程度に書くのだが、『WordPressプラグインのマルチサイト有効化の判定 | 日常の生活と仕事を雑記するコーダーのブログ | CattleMute』とにらめっこして、できそうな気もした。

のだけど、色々忙しくて(言い訳)、なんだかんだ気がつけば2週間くらい戦っていた。

なので、もう諦めて、手っ取り早い解決方法で解決することに…

てっとり早く突貫で解決する方法

先程記載したのね『apply_filters』部分を通り過ぎると、自分が期待したテーブルから欲しい値を返してくれている。
その先は読んでないから、よくは知らんけど。

なので、wp-includes/option.php にて

			 * @param bool   $passed_default Was `get_option()` passed a default value?
			 */
			return apply_filters( "default_option_{$option}", $default, $option, $passed_default );

から

			 * @param bool   $passed_default Was `get_option()` passed a default value?
			 */
			$temp = apply_filters( "default_option_{$option}", $default, $option, $passed_default );
			if(!empty($temp)){
				return $temp;
				unset($temp);
			}

に変えてしまう。

フィルターで呼び出せるなら、その方が軽そうだし、呼び出せずとも処理は動かした方が良いかな?と思わなくもないから『空の場合はreturnはしないで先に進む』に変更した状態。
けど、フィルターを呼び出すだけなので、まぁ、コメントアウトでも別に問題ないかも知れない。

補足

いやぁ、前はちゃんと個別で有効化に出来たと思ったんだよなぁ…
本体のファイルだから、本体アップデートしたらこの修正消えちゃう
消えちゃうんだよぉ

つか本当にこれは突貫でいわば『(仮)』だから!
やるにしても、自己責任でよろしくです。

今後、WordPressのアップデートでなんかうまいこと直るかも知れないしね!

コメント

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