是否有任何方法可以测试仅在插件更新上运行的函数是否成功运行?
对
后台更新插件时,WordPress会在后台执行几个操作。
下载插件的新版本,停用旧插件版本,删除旧插件版本,提取新版本,激活新版本upgrader_process_complete
. 此挂钩向回调传递两个参数:$this
, 这显然是对象实例$options[\'hook_extra\']
, 这些是传递给由调用的筛选器挂钩的额外参数WP_Upgrader::install_package()
. 这个Plugin_Upgrader
类传递以下数组:
array( \'plugin\' => $plugin,
\'type\' => \'plugin\',
\'action\' => \'update\',
)
因此,如果我们想在插件升级上运行函数,我们可以使用这个钩子。
add_action( \'upgrader_process_complete\', \'wpse_262412_upgrader_process_complete\' );
function wpse_262412_upgrader_process_complete( $instance, $extras ) {
//* Only interesting when \'our\' plugin updates
if(
\'plugin\' !== $extras[ \'type\' ] &&
\'update\' !== $extras[ \'action\' ] &&
\'my-plugin-name\' !== $extras[ \'plugin\' ]
) {
return;
}
//* Do something useful after your plugin updates
wpse_262412_something_useful();
}
检查如果您正在开发插件,并且希望在插件更新时运行特定功能,则可以向数据库中添加一个选项:
function wpse_262412_something_useful() {
include_once( ABSPATH . \'/wp-admin/includes/plugin.php\' );
$data = get_plugin_data( \'my-plugin-name\' );
update_option( \'my-plugin-update-option\', $data[ \'version\' ] );
}
然后,我们可以向init添加一个检查该选项值的操作。如果选项值等于当前插件版本,则我们知道该函数已运行。然后我们可以确保我们可以看到该功能已经运行,比如添加管理通知。
add_action( \'init\', \'wpse_262412_init\' );
function wpse_262412_init() {
$data = get_plugin_data( \'my-plugin-name\' );
$option = get_option( \'my-plugin-update-option\' );
if( $data[ \'version\' ] === $option ) {
//* The plugin update function ran successfully
add_action( \'admin_notices\', \'wpse_262412_update_notice\' );
}
}
function wpse_262412_update_notice() {
?>
<div class="updated notice">
<p><?php _e( \'The function has run correctly.\', \'wpse-262412\' ); ?></p>
</div>
<?php
}
但还有其他更好的方法吗?
这比你的方法好吗?我不知道。取决于您的应用程序。它不涉及打开和读取配置文件,因此可能会更快。但可能不太明显。我不会在生产现场使用这两种方法。确保您的代码在开发服务器上工作,然后使用它。如果你说的是比较插件版本号,那么对我来说,这似乎是最好的方法。