2.6対応は混乱気味
WP2.6 から wp-content や wp-config.php を他のディレクトリポイントへ変更できるようになったようですが、これがまた困ったことになっているようです。
特にプラグイン周りでは、これらに正式に対応するためのリファレンスコードが見当たりません。おかげで、作者が勝手に色んな対応をしているようですが、これがまた混乱に拍車をかけているように思います。
先日、困ったパターンは次の通り。
システムは WP2.5.1 です。
プラグインA が WP2.5 と WP2.6 に対応するためにコードを書いてました。
同じように、プラグインB も WP2.6 対応のコードを含んでいました。
WP_CONTENT_DIR, WP_CONTENT_URL, WP_PLUGIN_DIR, WP_PLUGIN_URL が絡んでいます。
●プラグインA の処理
if (!defined('WP_PLUGIN_DIR')) {
define('WP_PLUGIN_DIR', WP_CONTENT_DIR.'/plugins');
}// 以降、2.5 & 2.6 共通処理
●プラグインB の処理
if (!defined('WP_PLUGIN_DIR')) {
// WP2.5 用の処理
}
else {
// WP2.6 用の処理
}
プラグインA の処理は、要するに 2.5以前は、define されてないんだから、強制的に define しちゃえば 2.6 相当のコードを書けるから良いんじゃね?
と言う意図らしいです。
WP_CONTENT_DIR, WP_CONTENT_URL, WP_PLUGIN_DIR, WP_PLUGIN_URL それぞれに同様のコードが書かれてました。
ところが、これが問題を引き起こします。
そもそも勝手に define しちゃうんですから、それ以降、他のプラグインの処理が走るとき 2.6対応の処理が実行される可能性があります。システムは WP2.5 なのに。
上記例のプラグインB では、WP2.6用の処理が走ることになります。
プラグインA : defineしちゃえば良くね?
↓
プラグインA : 2.5 と 2.6 で共通処理出来て楽~
↓
プラグインB : define されてるじゃん。WP2.6なんだな。
↓
プラグインB : WP2.6用の処理起動~
↓
動かねー
こんな感じです。
これに気がついたのは、プラグインB が load_plugin_textdomain を呼んでいるところでした。この関数も 2.5 と 2.6 で仕様が変わっていたのです。
define されているかを見て、2.6側の load_plugin_textdomain を呼んでいて、ロケールデータが全く読めない状態だったのです。
さて、誰が悪いのでしょうか?
勝手に define しちゃう行儀の悪い プラグインA でしょうか?
それとも、define されているかどうかで判断している プラグインB でしょうか?
プラグインA は確かに問題があります。
システムで予約されている define を勝手に使用しているわけですから。
私が MobG で mp-mail.php の設定を利用しないものこの理由です。
そもそも、システムで使用している設定内容を他のプラグインやツールが我が物として勝手に書き換えたりするのは行儀が悪い以上にしてはいけないことだと思うのです。
しかし、プラグインB に問題が無いかと言えば、そうも言えない様に思います。
define されているか否かで判断するのは確実ではないからです。
他のプラグインが「たまたま」define している可能性を考えずに、それを判断の根拠とするのは少し考慮が足りないと思います。
本家や他の 2.6 関連のサイトを見ても、define の有無でシステムを判断しているコードを見かけますが、これはあまりよろしくないように思います。
バージョン依存するなら、はっきりとバージョンで判断するべきです。
横着せずに、$wp_version をちゃんと見ましょうよ。
と言うか、無理に両バージョンで対応するように作るから問題になると言う事もあるかも。
| 固定リンク
この記事へのコメントは終了しました。
コメント