我现在正在写我的第一个WordPress插件。因为我很确定这不会是我的最后一个,所以我尽量把尽可能多的代码放入公共代码文件中,以便以后在其他插件中重用。
我正在使用名称空间和OOP编程来允许代码被重用,就像我在c++项目中所做的那样(只要PHP允许这样做)。
然而,在WordPress/PHP有一个问题没有明显的解决方案:我应该把共享代码文件?WordPress将所有代码合并到一个全局应用程序中。因此,将代码复制到每个插件文件夹中可能意味着潜在的冲突和/或随机使用具有相同内容但开发阶段不同的代码文件。此外,这会产生丑陋的冗余。
我没有找到一个专用的中央存储位置。
将共享代码放入"plugins"文件夹是一个坏主意,因为每个共享的代码文件将被视为一个单独的插件。
我可以通过一个特殊的库插件来添加所有共享代码(据我所知,这将使包含的代码对所有其他插件可见),但这似乎有点奇怪。我也不确定这是否可靠。
最好的解决方案是什么?
WordPress在插件的可重用性方面有点糟糕。据我所知,没有任何集成的方法来重用WordPress插件中的代码。
你可以尝试Plugin Dependencies Plugin来管理插件之间的依赖关系。所以你可以把你的泛型代码存储在一个插件下,而其他插件可能会需要。
其他方法是使用WordPress的钩子/动作系统。因此,你将不得不推迟你的插件初始化,直到库插件钩子执行。
有激活/停用钩子,所以你可以在框架缺失的时候做一些事情。
看看这些页:
- 在WordPress中显示插件激活消息
- 函数参考/寄存器激活钩子
关于adamiscoding的回答:我正在尝试提出的钩子解决方案,将框架插件推到插件加载队列的第一位。我找到了一些允许这样做的代码片段,比如下面的代码:
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')
?