web-dev-qa-db-ja.com

シンボリックリンクディレクトリ内のプラグイン?

私がプラグインを開発するとき、私は異なる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を使用しても機能しません。インストール.

20
Jan Fabry

この問題は、plugins_urlフィルタにフックする必要があるプラグインを使用して部分的に解決できます。

plugin_basename()やcoなど、register_activation_hook()が使用される他のすべてのケースを扱うことはできません。

より多くの情報: http://core.trac.wordpress.org/ticket/16953

6
scribu

私は現在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%で機能するはずですが、私の開発セットアップのみが失敗し、新しいバージョンを簡単にリリースできます。

3
Jan Fabry

バグ46260 のコメントは$_SERVER["SCRIPT_FILENAME"]の代わりに__FILE__を使うことを提案します。これは機能しますか?

0
fuxia

$_SERVER["SCRIPT_FILENAME"]は、正しく使えば機能します。あなたはただベースパスを設定するためにそれを使い、そしてそのベースパスに相対的なパスを使ってあなたのファイルをインクルードする必要があります。

何かのようなもの:

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

まだwp-blog-header.phpにアクセスできない場合(つまり、ajaxベースのフォームリクエストを処理する場合)、これはより便利です。

0
Chad Furman