Принудительное обновление плагина: "Ошибка обновления: Ошибка обновления плагина". после обновления одного плагина


Я разрабатываю плагин, которому необходимо выполнить некоторые принудительные проверки обновлений для других плагинов, которые я размещаю на своем сайте с помощью EDD, поэтому у меня был такой пользовательский интерфейс:

enter image description here

И когда пользователь нажимает на кнопку Обновить, он отправляет запрос 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

Кто-нибудь создал что-то вроде того, что я хочу сделать? Я буду очень признателен за это.

Спасибо, что уделили мне время. :)

Author: Roel Magdaleno, 2018-02-22

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(), она не слушала их.

Поэтому мне пришлось создавать новые фильтры и выполнять их при вызове моего класса.

И все, проблема решена. Надеюсь, вы найдете это полезным.

 1
Author: Roel Magdaleno, 2018-03-16 00:00:50