什么时候/在哪里想要将其他类附加到WordPress插件中的基类?

时间:2020-01-23 作者:davemackey

我目前正在研究两个插件。每个函数都有一个名为plugin_classes 它将其他类附加到基类。

这两个插件都有inithooks 功能。

在第一次通话中$this->plugin_classes() 发生在hooks 函数,而在init 作用

在这两种情况下hooks 函数调用init 功能。

看来除了使用init 这些类在钩子中的类之后稍微添加(可能)。我有什么遗漏吗?

1 个回复
SO网友:Tim Elsass

如果没有一些额外的代码,很难回答这个问题,因为这些代码不是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.

    文件2查看该组织下的其他回购协议,我认为第二个插件可能是LiquidChurch/lqd-messages-fns 正如我看到的代码符合你的问题the main plugin file.

    呼叫LiquidChurch_Functionality->hooks 在WordPress中\'plugins_loaded 钩住L440LiquidChurch_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_actionadd_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执行之前执行。这通常是最好的方法,而不是依赖于被激发的挂钩顺序,或者插件文件夹名称的字母排序顺序。总体而言,给定的实现没有什么问题,您只需小心确保代码按照预期的顺序运行,以避免冲突或奇怪的场景。

    希望这个解释有帮助!