JeffreyFrancesco.org 公開日 タグ Tag Permalink 現在地 Facebook page Twitter RSS feed

まずはあけましておめでとうございます(遅
そんな訳で気が付けばまたしばらく更新が滞ってしまったので、リハビリがてらに小ネタをアップ。

このサイト自体は WordPress は使ってませんが、他のサイトを構築する時などは使う機会も多いので、一応ローカルには WordPress を動かせる環境を構築して時間があれば色々実験して遊んでる訳ですけど、そちらにちょっと WPtouch をインストールしてみたところ、どうもプラグインの設定画面の様子がおかしい…レイアウトは崩れてるし画像やスクリプトも読み込めてない感じ。

Safari の構成ファイル一覧ウィンドウで詳細を確認してみると「見つかりません」というファイルがいくつかあって、その URL をみるとファイルパスが変なところになっている。どうもプラグインファイルのあるディレクトリじゃなくて wp-content ディレクトリをベースに URL を割り出しているみたいですね。

実は現在のローカル環境は wp-content ディレクトリの中からテーマディレクトリとファイルアップロードディレクトリを外部に出しているという変な構成にしてまして、なので wp-config.php ファイルで WP_CONTENT_DIR, WP_CONTENT_URL, WP_PLUGIN_DIR, WP_PLUGIN_URL の4つの定数を define してあるんですが、WPtouch では「プラグインディレクトリは wp-content ディレクトリの中にあるはず」と決め打ちされてるような感じです。

という訳でちょっと WPtouch プラグインディレクトリ内のコードをひと通り覗いてみました。

すると、どうやら compat.php というファイルの中で WordPress の新旧バージョンや MU 版との違いを吸収する関数がいくつか定義されていることが分かりました。そしてその中の compat_get_base_plugin_dircompat_get_base_plugin_url という2つの関数でプラグインディレクトリの場所を特定しているのですが、そのコードが見事に(MU 版以外の場合は)プラグインディレクトリは wp-content ディレクトリ直下の plugins ディレクトリだろ JK …というコードになっております。涙

なので、その2つの関数コードを下記のように変更。WP_PLUGIN_DIR および WP_PLUGIN_URL が定義されていればそれを返すように条件式を付け足しただけです(プラグイン内のコードを直接弄ることになるので色々とアレですが、functions.php とかでは上書きすることができなかった…実際やってみましたが無理だった…ので仕方ない。もし方法があるならどなたか教えていただければ…)

if ( !function_exists( 'compat_get_base_plugin_dir' ) ) {
  function compat_get_base_plugin_dir() {
    if ( defined ('WP_PLUGIN_DIR') ) {
      return WP_PLUGIN_DIR;
    } elseif ( compat_is_wordpress_mu() && strpos( dirname( __FILE__ ), 'mu-plugins') !== false ) {
      return compat_get_wp_content_dir() . '/mu-plugins';
    } else {  
      return compat_get_wp_content_dir() . '/plugins';
    }
  }
}

if ( !function_exists( 'compat_get_base_plugin_url' ) ) {
  function compat_get_base_plugin_url() {
    if ( defined ('WP_PLUGIN_URL') ) {
      return WP_PLUGIN_URL;
    } elseif ( compat_is_wordpress_mu() && strpos( dirname( __FILE__ ), 'mu-plugins')  !== false ) {
      return compat_get_wp_content_url() . '/mu-plugins';
    } else {
      return compat_get_wp_content_url() . '/plugins';
    }
  }
}

あとの部分はこの関数で得られた正常なプラグインディレクトリをベースにパスを計算してくれるので、これ以上の修正は必要ないです。

という訳で、今のウチの環境のようにディレクトリ構成を複雑に変更してない場合には修正しなくても確実に動作しますので、多くの方にとってはあんまり関係ない話だと思いますが、参考になればと思います。ちなみに本日(2012年1月10日現在)Version 1.9.37 においての話なので、将来のバージョンでは修正されるかもしれません。つか英語得意な方誰か開発者サイドに伝えt(ry