插件在符号链接目录中?


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。

Answers:


6

该问题可以通过将必须使用的插件挂接到plugins_url过滤器中来部分解决。

它不能处理所有其他plugin_basename()使用情况,例如register_activation_hook()and co。

更多信息:http : //core.trac.wordpress.org/ticket/16953


我认为WP_PLUGIN_URL不建议使用,因为应该允许管理员更改此特定插件目录的名称,但是还有其他理由要避免使用它?确实,您的机票将是一个简单的解决方案。
日1月Fabry

反之。WP_PLUGIN_URL仅包含直接指向“插件”目录的URL。查看最新答案。
scribu 2011年

@scribu:但是,如果我的插件位于其中,/external/folder/banana-plugin/但是管理员以该身份链接到该目录/httpd-root/wp-content/plugins/apple-plugin/怎么办?然后它将尝试转到/wp-content/plugins/banana-plugin/,不是吗?而且我相信管理员应该可以自由选择单个插件目录名称?
日1月Fabry

我不再与您争论,因为我找到了解决方案:“ plugins_url”过滤器。再次更新答案。
scribu 2011年

FWIW此解决方案可能容易出错,并且仅在所有插件加载后才使用plugins_url()依赖于插件开发人员,否则您将无法在调用函数之前注册过滤器。Akismet插件和许多其他插件都存在该问题。
jerclarke 2011年

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 )运行您的if语句之前进行测试,因为我假设插件是否在其中,WP_CONTENT_DIR并且没有符号链接;我希望这是正确的逻辑。
MikeSchinkel

0

错误46260中的注释建议使用$_SERVER["SCRIPT_FILENAME"]代替__FILE__。这样行吗?


1
不,包含的文件不会改变。因此,如果index.php包括library.php$_SERVER['SCRIPT_FILENAME']library.php仍然会index.php。但是,感谢您对该错误的引用,我将密切关注它!
日1月Fabry

0

$_SERVER["SCRIPT_FILENAME"]如果使用正确,则可以使用。您只需要使用它来设置基本路径,然后使用相对于该基本路径的路径来包含文件。

就像是:

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

请注意,当您还没有访问wp-blog-header.php时(例如,在处理基于ajax的表单请求时),这将更为有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.