Plug的全局/主代码何时执行?

时间:2019-09-30 作者:TSG

我正在创建我的第一个wordpress插件,并且正在使用WPBP模板,这非常节省时间。

在插件的主要部分(称为myplugin.php),我添加了一个简单的命令,将一行文本写入文件。但是,当我刷新页面(我的网站的一个页面)时,我会看到大约4行内容写入到我的文件中。

执行myplugin。php是否为每个页面包含/执行多次?如果是,为什么?

接下来,强制每个页面只运行一次的最佳方法是什么。我计划创建一个PHP对象,不想创建4次。显然,如果类存在,我可以构建自己的检测,但这似乎是错误的。当然,WP设计了一些机制来确保插件全局/主代码只运行一次。

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

每个请求只加载一次插件。插件加载了以下代码:


// Load active plugins.
foreach ( wp_get_active_and_valid_plugins() as $plugin ) {
    wp_register_plugin_realpath( $plugin );
    include_once( $plugin );
    /**
     * Fires once a single activated plugin has loaded.
     *
     * @since 5.1.0
     *
     * @param string $plugin Full path to the plugin\'s main file.
     */
    do_action( \'plugin_loaded\', $plugin );
}
这在里面wp-settings.php, 只加载一次,但还要注意include_once 使用,这意味着插件无法加载两次,即使该代码出于某种原因运行了两次。

然而,我并不是说每个请求都是如此。这意味着从页面发送的任何AJAX请求都会导致在后台为每个AJAX请求加载插件。这可以解释为什么函数会多次运行

SO网友:Crisoforo Gaspar

在这种情况下,您可以将代码功能附加到挂钩上,这种情况下最常见的一种是plugins_loaded. 您可以查看有关此挂钩的更多详细信息on the codex.

例如:

<?php 

add_action( \'plugins_loaded\', function() {
  $my_plugin = new Plugin();
  $my_plugin()->init();
});
另一种方法是使用Singleton 对象类的模式,以便更新为以下方法:

<?php 
$my_plugin = Plugin::getInstance();
add_action( \'plugins_loaded\', [ $my_plugin, \'init\' ]);

相关推荐