防止冗余的Wordpress插件代码

时间:2014-03-18 14:19:23

标签: php wordpress plugins code-reuse reusability

我目前正在编写我的第一个Wordpress插件。因为我很确定这不会是我的最后一个,所以我尝试将尽可能多的代码放入公共代码文件中,以便以后在其他插件中重用。

我正在使用命名空间和OOP编程来允许像我在C ++项目中那样重用代码(就PHP而言)。

然而在WP / PHP中存在一个没有明显解决方案的问题:我应该在哪里放置共享代码文件? Wordpress类合并了全局应用程序中的所有代码。因此,将代码复制到每个插件文件夹中可能意味着潜在的冲突和/或随机使用具有相同内容但不同开发阶段的代码文件。这也会造成丑陋的裁员。

我没有找到专门的中央存储空间。

将共享代码放在“plugins”文件夹中是一个坏主意,因为每个共享代码文件都被视为一个单独的插件。

我可以通过一个特殊的库插件添加所有共享代码(afaik这将使所包含的代码对所有其他插件可见)但这看起来有点奇怪。我也不确定这是否可靠。

什么是最佳解决方案?

2 个答案:

答案 0 :(得分:1)

Wordpress有点像插件中的可重用性。 据我所知,没有集成的方法来重用WordPress插件中的代码。

你可以尝试一下 https://github.com/x-team/wp-plugin-dependencies 插件来管理插件之间的依赖关系。因此,您可以将通用代码存储在其他人需要的插件下。

其他方法是使用Worpress钩子/动作系统。因此,在执行库插件挂钩之前,您必须对插件初始化进行设置。

有激活/停用挂钩,所以当框架丢失时你可以做一些事情。 看看这些链接:
http://tommcfarlin.com/plugin-activation-message/
https://codex.wordpress.org/Function_Reference/register_activation_hook
希望这有帮助!

答案 1 :(得分:0)

@adamiscoding:我正在尝试你提出的钩子解决方案,将framework-plugin推到插件加载队列的第一位。我发现了一些应该允许这样做的代码片段,如下所示:

add_action('activated_plugin', 'load_this_plugin_first');

function load_this_plugin_first() 
{
   $path = plugin_basename(dirname(__FILE__)).'/'.basename(__FILE__);
   if ( $plugins = get_option( 'active_plugins' ) ) {
      if ( $key = array_search( $path, $plugins ) ) {
         array_splice( $plugins, $key, 1 );
         array_unshift( $plugins, $path );
         update_option( 'active_plugins', $plugins );
      }
   }
}

如果没有安装/激活框架插件,我会依赖禁用依赖插件,所以在这种情况下加载插件管理页面时,我不会得到关于缺少定义的一堆错误。我正在使用以下检查:

if (!class_exists('Framework\MainClass'))
{
   if (is_admin())
   {
      // What to do here?
   }
}
else
{
   // Normal plugin code
}

这似乎工作正常。

目前我有点不确定在缺少框架的情况下应该做些什么。我可以自动停用它。或者我可以显示一个持久的管理员消息......但这并不容易,因为我收到了关于"意外输出的一些字符的警告"当由于消息代码行激活依赖的插件时:

echo "<div class='updated'><p>Plugin will not work without framework!</p></div>";

这就是我尝试检查插件代码是否在激活期间执行的原因,因此我可以在这种情况下禁止该消息:

if (!function_exists('is_plugin_active'))
{
   echo "<div class='updated'><p>Plugin will not work without Framework!</p></div>";
}

这似乎也有效,但我想知道是否有一种更好的方法来检查激活期间插件是否在function_exists('is_plugin_active')之后执行?