强制插件更新:“更新失败:插件更新失败。”更新后的一个插件

时间:2018-02-22 作者:Roel Magdaleno

我正在开发一个插件,需要对我与EDD一起托管在网站上的其他插件进行强制更新检查,所以我有了这个UI:

enter image description here

当用户点击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;
        }
  }
到目前为止一切都很好,我们得到了插件更新(在这张图中,用户单击了两个插件的更新按钮):

enter image description here

然后,用户更新一个插件,并正确更新它,没有错误。但是,如果用户尝试更新另一个插件,比如WP Bullet Assets Manager, 获取错误:

Update Failed: Plugin update failed.

在开发者控制台中显示:

The plugin is at the latest version.

以下是对AJAX更新的响应:

enter image description here

但是,如果用户更新,例如联系表单7,则会正确更新。

此外,我必须使用upgrader_process_complete 用于设置update_plugins 站点再次短暂,如果我不这样做,其他更新将消失。

这里的好处是,如果我在一个插件更新后刷新插件页面,那么另一个插件会正常更新,因为我在瞬态中仍然有插件数据。

所以,我被困在那里了。

此外,我检查了update_plugins 暂时的内容,请注意,当一切正常时,它向我显示:

enter image description here

但在更新了一个插件后,我看到了:

enter image description here

您可以在此处检查瞬态内容:

好的一面是:https://www.unserialize.com/s/41cddcdd-bd49-9de9-330e-000062c8267b

坏消息:https://www.unserialize.com/s/364b6ebe-e29b-4fc8-4360-0000723d32b8

有人创造了我想做的事情吗?我会非常感激的。

谢谢您的时间。:)

1 个回复
最合适的回答,由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(), 不是听他们的。

因此,我必须创建新的过滤器,并在调用我的类时执行它们。

就这样,问题解决了。希望你能发现这个有用。

结束

相关推荐

PLUGINS_LOADED操作工作不正常

我试图在表单提交后向用户发送电子邮件,但出现错误Call to undefined function wp_mail() in C:\\xampp\\htdocs\\wordpress\\wp-content\\plugins\\contact form\\contact-form-plugin.php on line 46<我在谷歌上搜索了一下,发现它与add_action( \'plugins_loaded\', \'functionShowForm\' );.我在代码中添加了这一行,但它在主窗