我想在插件更新时执行一个数据库操作。我当前版本的插件没有这个钩子。我在更新后的版本中添加了以下代码。我正在使用以下代码,但这不起作用。
add_action( 'upgrader_process_complete', 'init_plugin_update', 10, 2 );
function init_plugin_update( $upgrader_object, $options ) {
error_log('test123');
}
我见过WooCommerce使用相同的钩子。那么是不是有什么我不知道的?新的插件文件不会在此操作之前加载?
1条答案
按热度按时间nnsrf1az1#
upgrader_process_complete钩子,正如法典中所述:
在升级程序进程完成时激发。
但《注解》中也有说明:
慎用:当你在你的插件中使用upgrader_process_complete动作钩子,并且你的插件是正在升级的插件时,那么这个动作将运行你插件的旧版本。
实际上,这意味着,如果你的插件的当前版本是1.0,它没有这个钩子,而你正在更新插件到版本2.0,它有那个钩子-它不会被解雇.
此挂钩和其他挂钩的其他问题
要执行数据库升级(如果您的2.0版本具有不同的表结构),显然不能使用此钩子。
还有另一种情况-当你的插件是通过FTP而不是管理界面更新的(例如你通过GIT CI/CD管道推送一些文件更改)-没有一个钩子会被触发。
解决方案
手动管理插件的数据库版本。
1.使用add_option将当前插件版本保存在数据库中。
1.在init钩子上(或者更好,在admin_init钩子上,因为它只在管理请求期间被触发-核心使用这种技术)执行检查插件的当前版本是否等于数据库中保存的版本。使用get_option并将其与插件本身中硬编码的版本进行比较
1.如果存在不匹配,则意味着数据库使用旧的代码库,您需要更新它