Принудительное обновление плагина: "Ошибка обновления: Ошибка обновления плагина". после обновления одного плагина
Я разрабатываю плагин, которому необходимо выполнить некоторые принудительные проверки обновлений для других плагинов, которые я размещаю на своем сайте с помощью EDD, поэтому у меня был такой пользовательский интерфейс:
И когда пользователь нажимает на кнопку Обновить, он отправляет запрос 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
Кто-нибудь создал что-то вроде того, что я хочу сделать? Я буду очень признателен за это.
Спасибо, что уделили мне время. :)
1 answers
Я решил свою проблему, поэтому для тех людей, которые хотят добиться того же, что и при принудительном обновлении с помощью EDD, вот решение (или, по крайней мере, работало для меня):
Во-первых, когда вы обновляете плагин через страницу плагинов, это происходит через AJAX, поэтому мне пришлось прочитать файл /wp-admin/includes/ajax-actions.php
, и внутри функции wp_ajax_update_plugin()
обнаружена функция wp_update_plugins()
, которая выполняла функцию wp_update_plugins()
, поэтому я понял, что перезаписывал переходный процесс сайта update_plugins
.
В этот момент я думал, что мои фильтры работают, но нет, дело в том, что я выполнял эти фильтры внутри действия current_screen
, и когда функция wp_update_plugins()
была вызвана из wp_ajax_update_plugin()
, она не слушала их.
Поэтому мне пришлось создавать новые фильтры и выполнять их при вызове моего класса.
И все, проблема решена. Надеюсь, вы найдете это полезным.