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


20

プラグインを開発するとき、異なるwp-contentディレクトリにあるプラグインディレクトリをシンボリックリンクすることにより、複数のバージョンのWordPressでテストします。ファイルを一度編集するだけなので、これは素晴らしいことですが、プラグイン内のリソースへの参照を生成するための重要な構造を壊します。__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であるため、ここでの使用は機能しません。したがって、WordPressは最初の部分を削除して、WordPressインストールに関連するURLを生成できません。

回答:


6

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

やco plugin_basename()など、使用される他のすべてのケースは処理されませんregister_activation_hook()

詳細:http : //core.trac.wordpress.org/ticket/16953


WP_PLUGIN_URL管理者がこの特定のプラグインのディレクトリの名前を変更できるようにする必要があるため、使用は推奨されていないと思いますが、それを避ける別の理由もありますか?そして実際、あなたのチケットは簡単な解決策でしょう。
1月ファブリー

それどころか。WP_PLUGIN_URLには、「プラグイン」ディレクトリを直接指すURLのみが含まれます。更新された回答を参照してください。
スクライブ

@scribu:しかし、私のプラグインが住んで/external/folder/banana-plugin/いて、管理者がそのディレクトリにリンクしている場合はどう/httpd-root/wp-content/plugins/apple-plugin/ですか?次に、に移動しようとし/wp-content/plugins/banana-plugin/ますか?そして、管理者は個々のプラグインのディレクトリ名を自由に選択できるはずだと思いますか?
ヤンファブリ

解決策である「plugins_url」フィルターが見つかったため、これについてはもう議論しません。回答を再度更新しました。
スクライブ

FWIWこのソリューションはエラーが発生しやすく、すべてのプラグインが読み込まれた後にのみplugins_url()を使用するプラグイン開発者に依存します。そうでない場合、関数が呼び出される前にフィルターを登録できません。Akismetプラグインと他の多くのプラグインにはこの問題があります。
-jerclarke

3

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


素晴らしいソリューション@Jan。これらの変数はとしてアクセス可能であることを忘れていたため、関数を呼び出してループすることにより、同様のものを実装しましたglobal。ここに投稿していただいたおかげで、もっと簡単にできることに気付きました。ところで、false === strpos( __FILE__, WP_CONTENT_DIR )プラグインが含まれてWP_CONTENT_DIRいるかどうかはシンボリックリンクされていないので、ifステートメントを実行する前にテストしています。私はそれが有効な論理であることを望んでいます。
MikeSchinkel

0

バグ46260のコメントは、の$_SERVER["SCRIPT_FILENAME"]代わりに使用することを示唆しています__FILE__。これは機能しますか?


1
いいえ、これは含まれるファイルでは変わりません。だから、もしindex.php含まれていればlibrary.php$_SERVER['SCRIPT_FILENAME']in library.phpはまだですindex.php。しかし、バグへの参照のおかげで、私はそれを密接にフォローします!
ヤンファブリ

0

$_SERVER["SCRIPT_FILENAME"]正しく使用すれば機能します。それを使用してベースパスを設定し、そのベースパスに関連するパスを使用してファイルを含める必要があります。

何かのようなもの:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.