加载插件前在插件激活时运行函数

时间:2014-10-07 作者:John

我有两个版本的相同插件-一个是WordPress上的免费版本。org,另一个是付费升级。两个版本使用相同的函数名,因此不能同时激活。当有人在当前停用免费版本之前安装并激活付费版本时,将显示一个致命错误,说明“致命错误:无法重新声明abc\\U函数()(之前在…)中声明)”。

我正在尝试为付费版本添加register\\u activation\\u hook,它会自动停用免费版本或显示wp\\u die通知,要求他们停用免费版本。我可以让它们工作,但问题是它们似乎运行得不够早,因此我得到了重新声明的函数致命错误。这就是我正在使用的:

function abc_activate() {
    if ( function_exists(\'abc_function\') ) die( "Please deactivate the free version..." );
}
register_activation_hook( __FILE__, \'abc_activate\' );
我还尝试将wp\\u die和deactivate\\u plugins函数附加到admin\\u init操作,但在出现致命错误之前似乎也没有运行。例如:

function abc_warning_message() {
    wp_die( "Please deactivate the free version of the plugin..." );
    deactivate_plugins( \'abc-plugin-name\' );
}
add_action( \'admin_init\', \'abc_warning_message\' );
是否有人知道我可能做错了什么,或者是否有可能在由于函数名重复而触发致命错误之前调用函数?最坏的情况下,我可以通过插件重命名所有的函数名,但我希望能够让它正常工作。

提前感谢您的帮助!

约翰

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

WordPress不是魔法。如果您添加和动作挂钩(register_activation_hook just add an action hook) 要让WordPress能够阅读和运行它,必须load 你的主插件文件,它不能猜测它的内容。

如果WordPress加载您的主插件文件,它将加载其中定义的所有函数(或直接包含在其中的文件中),因此您将得到致命错误。

如果要这样做,需要加载所有函数after WordPress解析了您的主插件文件,如果两个版本都被激活,则解析了这两个文件。

免费插件的主插件文件应仅包含以下内容:

add_action( \'plugins_loaded\', \'myplugin_require_everything_free\', 100 );

function myplugin_require_everything_free() {
  // require all free plugin files here
}
没有更多的代码。(当然,在文件的顶部会有插件头)。

付费版本中的主插件文件应仅包含以下内容:

add_action( \'plugins_loaded\', \'myplugin_require_everything_paid\', 1 );

function myplugin_require_everything_paid() {

  if ( function_exists( \'myplugin_require_everything_free\' ) ) {
     remove_action( \'plugins_loaded\', \'myplugin_require_everything_free\' );
     deactivate_plugins( \'abc-plugin-name-free\' );
  }
  // require all paid plugin files here
}
当两个文件都被解析后,这两个函数在同一个钩子上运行,但付费插件函数首先运行,因为它具有更高的优先级。

如果付费版本功能发现免费版本已激活,则会删除添加的操作免费版本文件,停用免费版本插件,并且仅after 加载包含插件函数的文件。

这样就不会发生冲突。。。

结束

相关推荐

无法在多站点上查看网络plugins.php或upgrade-core.php

我有一个有5或6个站点的网络。在网络管理面板中,我可以看到除/wp admin/network/plugins之外的所有页面。php页面和/wp admin/network/upgrade核心。php页面。查看文件夹结构时,这两个文件都存在,但由于某些原因,它们不会加载。非常感谢您的帮助。