我正在开发一个插件,需要对我与EDD一起托管在网站上的其他插件进行强制更新检查,所以我有了这个UI:
当用户点击
Update 按钮,它向我的站点发出API请求,并决定是否有可用于该插件的新版本;如果有新版本,我会在瞬态中保存一些插件数据。
之后,用户需要转到插件页面,使用我们刚才在瞬态中保存的数据,我们使用EDD_SL_Plugin_Updater 通过重置update_plugins
现场瞬态:
$modules_to_update = ! $this->update_plugins ? $this->current_modules->modules : $this->update_plugins;
array_walk( $modules_to_update, array( $this, \'check_plugins_updates\' ) );
private function check_plugins_updates( $module_data, $module_name ) {
$plugin_constants = parent::get_plugin_constants_values( $module_name );
if ( $this->update_plugins ) {
new WPB_EDD_SL_Plugin_Updater( $this->current_modules->api_url, $plugin_constants[\'basename\'], $module_data );
/**
* Reset the "update_plugins" site transient,
* so it can do a force check plugin update.
*
* This is extremely necessary, because WordPress check
* plugins after hours or even minutes, sometimes.
*/
set_site_transient( \'update_plugins\', \'\' );
return;
}
}
到目前为止一切都很好,我们得到了插件更新(在这张图中,用户单击了两个插件的更新按钮):
然后,用户更新一个插件,并正确更新它,没有错误。但是,如果用户尝试更新另一个插件,比如
WP Bullet Assets Manager, 获取错误:
Update Failed: Plugin update failed.
在开发者控制台中显示:
The plugin is at the latest version.
以下是对AJAX更新的响应:
但是,如果用户更新,例如联系表单7,则会正确更新。
此外,我必须使用upgrader_process_complete
用于设置update_plugins
站点再次短暂,如果我不这样做,其他更新将消失。
这里的好处是,如果我在一个插件更新后刷新插件页面,那么另一个插件会正常更新,因为我在瞬态中仍然有插件数据。
所以,我被困在那里了。
此外,我检查了update_plugins
暂时的内容,请注意,当一切正常时,它向我显示:
但在更新了一个插件后,我看到了:
您可以在此处检查瞬态内容:
好的一面是:https://www.unserialize.com/s/41cddcdd-bd49-9de9-330e-000062c8267b
坏消息:https://www.unserialize.com/s/364b6ebe-e29b-4fc8-4360-0000723d32b8
有人创造了我想做的事情吗?我会非常感激的。
谢谢您的时间。:)
最合适的回答,由SO网友:Roel Magdaleno 整理而成
我解决了我的问题,所以对于那些想通过使用EDD强制更新实现同样效果的人,这里有一个解决方案(或者至少对我有效):
首先,当您通过插件页面更新插件时,它是通过AJAX更新的,所以我必须阅读/wp-admin/includes/ajax-actions.php
文件的内部wp_ajax_update_plugin()
找到正在执行的函数wp_update_plugins()
函数,所以我意识到update_plugins
现场瞬态。
此时,我以为我的过滤器正在执行,但没有,问题是我在current_screen
操作,以及wp_update_plugins()
函数是从调用的wp_ajax_update_plugin()
, 不是听他们的。
因此,我必须创建新的过滤器,并在调用我的类时执行它们。
就这样,问题解决了。希望你能发现这个有用。