开发Wordpress插件时的第三方依赖冲突

时间:2018-05-02 23:13:54

标签: php wordpress composer-php guzzle

我正在开发一个使用composer的插件..这意味着它在插件文件夹中有一个供应商文件夹,其中包含Guzzle HTTP依赖

在wordpress网站上我们安装了这个插件,现有的插件有Guzzle HTTP

现在,当我们激活此插件时,我收到的错误是这样的:

Fatal error: Cannot redeclare GuzzleHttp\uri_template() (previously declared in /nas/content/staging/project/wp-content/plugins/my-plugin/vendor/guzzlehttp/guzzle/src/functions.php:17) in /nas/content/staging/project/wp-content/plugins/other-plugin/includes/lib/aws-sdk/GuzzleHttp/functions.php on line 31

我尝试安装插件加载顺序以强制'other-plugin'在'my-plugin'之前加载 目前错误发生在other-plugin的资源上。 这样,错误将在我们的自动加载中产生,我们可以捕获它。

不幸的是..插件加载顺序无效..

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

欢迎来到WordPress地狱。我们有2018年,WordPress仍然没有任何依赖管理,仍然没有注意到Composer的存在。

WordPress生态系统只依赖于假设,插件/主题的函数/类名称应该是唯一的。显然,使用插件/主题分发流行的第三方Composer库是一件麻烦事 - 当其他插件执行相同操作时,很容易让名称发生冲突。没有好办法摆脱这种情况。

如果您需要针对独立插件的防弹解决方案,则应在vendor目录中的每个包的名称空间前加上插件前缀,例如myplygin\vendor。然后GuzzleHttp\Client变为myplugin\vendors\GuzzleHttp\Client,因此不存在名称冲突的风险。这将需要一些工作来为此编写脚本(或者您可以使用一些现有的解决方案,如humbug/php-scoper),并且您可能会获得许多重复的依赖项(10个插件可能会带来相同的库10次,但具有不同的命名空间) ,但这是将现代工具和模式集成到过时软件中的成本。

如果您正在为自己编写此插件并且您正在控制最终安装,则可以尝试use Composer for installing WordPress and its plugins。如果他们已经捆绑了一些编写器库,你仍然可能需要修复第三方插件(通过分叉),但从长远来看,它应该简化许多事情,你可以避免为每个插件重复库。

答案 1 :(得分:1)

这不建议使用,但如果必须

,请使用它
function this_plugin_last() {
    $wp_path_to_this_file = preg_replace('/(.*)plugins\/(.*)$/', WP_PLUGIN_DIR."/$2", __FILE__);
    $this_plugin = plugin_basename(trim($wp_path_to_this_file));
    $active_plugins = get_option('active_plugins');
    $this_plugin_key = array_search($this_plugin, $active_plugins);
        array_splice($active_plugins, $this_plugin_key, 1);
        array_push($active_plugins, $this_plugin);
        update_option('active_plugins', $active_plugins);
}
add_action("activated_plugin", "this_plugin_last");

答案 2 :(得分:0)

我猜测第31行的GuzzleHttp / functions.php中有一个函数,所以你可以使用类似的东西:

  if (function_exists('Do_Something')){
       echo "Function Exists"; 
    }else{
       echo "Function Not Found, This name Can be used!";
    }

或者您可以使用is_plugin_active函数来检查插件是否已安装。在这种情况下,您可以忽略包含文件

https://codex.wordpress.org/Function_Reference/is_plugin_active