如果没有一些额外的代码,很难回答这个问题,因为这些代码不是WordPress的核心功能,可以做任何事情。基于前面的问题,我假设您所指的插件之一是LiquidChurch/lqd-messages plugin 我在main plugin file. 即使这不是正确的文件,希望解释这些文件的执行顺序将有助于解释何时调用对象。
文件1
该代码的执行顺序如下:
在GC_Sermons_Plugin->hooks
函数已添加到plugins_loaded
在…上L321.这将为tgmpa_register
运行函数register_required_plugin
, 检查插件的依赖项是否已安装(使用TGMPA) 在…上L186.如果该检查通过,则该方法GC_Sermons_Plugin->init
到init
钩住L189.
GC_Sermons_Plugin->plugin_classes
被称为,在plugins_loaded
钩住L190.plugins_loaded
发生在之前init
(不要混淆GC_Sermons_Plugin->init
, 因为这可能被称为你想要的任何东西)。正在调用的代码GC_Sermons_Plugin->plugin_classes
正在WordPress挂钩中的此文件中发生plugins_loaded
, 以及GC_Sermons_Plugin->init
正在WordPress中运行函数init
钩这意味着GC_Sermons_Plugin->plugin_classes
之前已调用GC_Sermons_Plugin->init
.
呼叫LiquidChurch_Functionality->hooks
在WordPress中\'plugins_loaded
钩住L440通话LiquidChurch_Functionality->init
在WordPress中\'init
挂钩在LiquidChurch_Functionality->init
它调用LiquidChurch_Functionality->plugin_classes
.
这可能是以这种方式完成的,以便自挂钩后,在液化教堂/lqd消息之后运行液化教堂/lqd消息fns的代码
plugins_loaded
发生在之前
init
WordPress内部。
潜在问题我不知道给定场景中是否存在问题,但我想谈谈需要注意的一件事。如果加载的任何类GC_Sermons_Plugin->plugin_classes
来自示例File 1 将代码添加到WordPress挂钩init
- 这可以在File 2, 它也在WordPress挂钩中运行init
.
据我回忆,WordPress中的插件大部分时间是按字母顺序加载的,但这就是使用priority
的参数add_action
和add_filter
这很重要。而不是依赖以下事实plugins_loaded
发生在之前init
, 最好依赖以下事实:您想要运行的所有代码init
按您希望的顺序发生。我从第一个插件中看到,有多个composer依赖项,因此这些外部代码库可以在WordPress执行的任何时候调用代码的某些部分。有些可能是在你想要的之前或之后。
如果我们改为这样做:
// Plugin 1
add_action( \'init\', array( $this, \'plugin_classes\' ), 10 );
// Plugin 2
add_action( \'init\', array( $this, \'plugin_classes\' ), 20 );
我们将使用priority参数来表示以优先级10运行此代码,该优先级在优先级20之前执行-确保插件1的代码始终在同一挂钩上执行,并且在插件2执行之前执行。这通常是最好的方法,而不是依赖于被激发的挂钩顺序,或者插件文件夹名称的字母排序顺序。总体而言,给定的实现没有什么问题,您只需小心确保代码按照预期的顺序运行,以避免冲突或奇怪的场景。
希望这个解释有帮助!