私がプラグインを開発するとき、私は異なるwp-content
ディレクトリに私のプラグインディレクトリをシンボリックリンクすることによってWordPressの複数のバージョンでそれらをテストします。ファイルを1回編集するだけでよいのでこれは素晴らしいことですが、プラグイン内のリソースへの参照を生成するための重要な構成要素を壊します。__FILE__
は、wp-content
内の場所ではなく、物理的なプラグインの場所を参照します。これをどのように解決すればいいですか。
私のディレクトリ構造は次のようになります。
/path/to/wordpress/development/dir/
plugin-development/
monkeyman-rewrite-analyzer/
monkeyman-rewrite-analyzer.php
js/
monkeyman-rewrite-analyzer.js
versions/
3.1/
wp-content/
plugins/
monkeyman-rewrite-analyzer
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
Javascriptファイルをエンキューしたい場合は、plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
を使用する必要がありますが、実際のファイルパスは__FILE__
ではなく/path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
になるため、ここで/path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
を使用しても機能しません。インストール.
この問題は、plugins_url
フィルタにフックする必要があるプラグインを使用して部分的に解決できます。
plugin_basename()
やcoなど、register_activation_hook()
が使用される他のすべてのケースを扱うことはできません。
私は現在WordPressの相対的なファイルの場所を取得するためにトリックを使用しています:wp_get_active_and_valid_plugins()
はファイルパスを返し、 wp_settings.php
はそれらをループしてファイル をインクルードします。そのため、グローバル$plugin
変数はあなたの現在のプラグインを参照します(もちろんプラグインがロードされているときだけです。私は接頭辞の付いたグローバル変数に保存します):
$monkeyman_Rewrite_Analyzer_file = $plugin;
プラグインは必ず使用するプラグインまたはネットワークプラグインとしてロードすることもできるため、 これらのループは他の変数名 を使用するため、完全なコードは次のようになります。
$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
$monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
$monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
$monkeyman_Rewrite_Analyzer_file = $plugin;
}
フォールバックはまだ__FILE__
なので、将来、誰かがループ変数名を変更しても、私のコードはすべてのインストールの99%で機能するはずですが、私の開発セットアップのみが失敗し、新しいバージョンを簡単にリリースできます。
バグ46260 のコメントは$_SERVER["SCRIPT_FILENAME"]
の代わりに__FILE__
を使うことを提案します。これは機能しますか?
$_SERVER["SCRIPT_FILENAME"]
は、正しく使えば機能します。あなたはただベースパスを設定するためにそれを使い、そしてそのベースパスに相対的なパスを使ってあなたのファイルをインクルードする必要があります。
何かのようなもの:
$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";
まだwp-blog-header.phpにアクセスできない場合(つまり、ajaxベースのフォームリクエストを処理する場合)、これはより便利です。