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:
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):
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:
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:
Mais après la mise à jour d'un plugin, montre-moi simplement ceci:
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. :)
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.