web-dev-qa-db-fra.com

Forcer les mises à jour du plug-in: "La mise à jour a échoué: la mise à jour du plug-in a échoué." après mise à jour un plugin

Je développe un plugin qui nécessite des vérifications de mise à jour forcées pour les plugins que j'héberge sur mon site avec EDD. Je disposais donc de cette interface utilisateur:

 enter image description here 

Et lorsque l'utilisateur clique sur le bouton Update , il envoie une demande d'API à mon site et décide s'il existe une nouvelle version disponible pour ce plugin; s'il y a une nouvelle version, j'enregistre des données de plug-in dans un transitoire.

Après cela, l’utilisateur doit aller à la page Plugins, et avec les données que nous venons d’enregistrer dans le transitoire, nous obtenons le téléchargement du paquet et davantage d’informations sur le plugin en utilisant le EDD_SL_Plugin_Updater class et faisons un forçage. mettre à jour le contrôle en réinitialisant le site update_plugins transitoire:

$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;
        }
  }

Tout va bien jusqu'à présent, nous obtenons les mises à jour des plugins (Sur cette image, l'utilisateur clique sur le bouton Mettre à jour pour les deux plugins):

 enter image description here 

Ensuite, l'utilisateur met à jour un plugin et le met à jour correctement, sans erreur. Toutefois, si l'utilisateur tente de mettre à jour un autre plug-in, disons que WP Bullet Assets Manager obtient une erreur:

Update Failed: Plugin update failed.

Et dans la console des développeurs dit:

The plugin is at the latest version.

Et voici la réponse pour la mise à jour AJAX:

 enter image description here 

Mais si la mise à jour de l'utilisateur, par exemple, Contact Form 7, la met à jour correctement.

De plus, je dois utiliser le crochet d'action upgrader_process_complete pour configurer à nouveau le site update_plugins transitoire. Si je ne le fais pas, l'autre mise à jour disparaît.

La bonne chose ici est que, si je rafraîchit la page des plugins après la mise à jour d’un plugin, l’autre plugin se met à jour normalement, car j’ai toujours les données du plugin dans le transitoire.

Donc, je suis coincé là.

De plus, j'ai vérifié le contenu transitoire update_plugins et remarqué que lorsque tout fonctionne, cela me montre ceci:

 enter image description here 

Mais après la mise à jour d'un plugin, montre-moi simplement ceci:

 enter image description here 

Vous pouvez vérifier le contenu transitoire ici:

Le bon: https://www.unserialize.com/s/41cddcdd-bd49-9de9-330e-000062c8267b

Le mauvais: https://www.unserialize.com/s/364b6ebe-e29b-4fc8-4360-0000723d32b8

Est-ce que quelqu'un a créé quelque chose que je veux faire? Je vais vraiment l'apprécier.

Merci pour votre temps. :)

1
Roel Magdaleno

J'ai résolu mon problème. Pour les personnes qui souhaitent obtenir le même résultat en imposant des mises à jour forcées à l'aide d'EDD, voici la solution (ou du moins, a fonctionné pour moi):

Tout d'abord, lorsque vous mettez à jour un plugin via la page des plugins, il le fait via AJAX. J'ai donc dû lire le fichier /wp-admin/includes/ajax-actions.php et à l'intérieur de la fonction wp_ajax_update_plugin(), trouvé qu'il exécutait la fonction wp_update_plugins(), j'ai donc réalisé qu'il remplaçait le site update_plugins transitoire.

À ce stade, je pensais que mes filtres s’exécutaient, mais non, c’est que j’exécutais ces filtres à l’intérieur de l’action current_screen et lorsque la fonction wp_update_plugins() a été appelée à partir de wp_ajax_update_plugin(), elle ne les a pas écoutés.

J'ai donc dû créer de nouveaux filtres et les exécuter lorsque ma classe est appelée.

Et c'est tout, problème résolu. J'espère que vous pourrez trouver cela utile.

1
Roel Magdaleno