Un délai pour mettre à jour automatiquement les plugins
Depuis la version 3.7 de WordPress nous avons la possibilité de mettre à jour automatiquement WordPress et ses modules.
Livré avec cette nouvelle fonctionnalité, tout un tas de hooks ont été mis à la disposition des développeurs et utilisateurs qui souhaitent paramétrer plus finement l’autoupdate du core, des plugins, des thèmes et des traductions. C’est là dessus que nous allons nous pencher, et plus particulièrement sur la mise à jour des plugins.
En ce qui concerne la mise à jour automatique des plugins, il y a deux écoles : ceux qui y sont opposés, jugeant que la mise à jour d’un plugin est une opération trop sensible pour être opérée de manière automatique, les nouvelles versions étant parfois instables, et ceux qui pensent que, pour des raisons de sécurité, l’auto-update doit être activé systématiquement afin de corriger rapidement les failles repérées dans les plugins.
Pour concilier les deux clans, j’ai envie de proposer quelque chose : et si on attendait simplement quelques jours avant d’appliquer une mise à jour de manière automatique ? Cela laisserait un peu de temps à la communauté pour remonter/corriger les bugs d’une nouvelle version de plugin, et cela garantirait tout de même la mise à jour au bout d’un certain temps.
Le code pour attendre avant de mettre à jour un plugin
Sans plus tarder, voici le code qui va nous permettre d’activer la mise à jour automatique des plugins, en patientant un certain lapse de temps avant chaque mise à jour.
Ces lignes peuvent être insérées dans un mu-plugin, ou bien dans le functions.php de votre thème. Je vous laisse les lire avant de vous les détailler.
Tout d’abord, il faut accrocher notre fonction sur le filtre auto_update_plugin ; ce filtre est appelé dans wp_maybe_auto_update() afin de savoir si un plugin doit être mis à jour automatiquement. Il prend deux paramètres :
- $update, la valeur à renvoyer. True on met à jour / false on ne fait rien ;
- $item, correspondant à l’objet plugin, qui contient des infos telles que le slug, ou la nouvelle version disponible.
Les plugins qui disposent d’une mise à jour seront poussés dans une option que j’ai nommé deferred_plugin_autoupdates. On la récupère si elle existe, sinon il faut la créer.
Ensuite on récupère les informations qui nous seront utiles, à savoir le slug de l’extension WordPress ainsi que le numéro de la nouvelle version disponible.
Si ce plugin (identifié par son slug) est dans notre option, avec ce numéro de version précis, de deux choses l’une :
- Soit cela fait plus de trois jours qu’il y est, et on retourne true (ce qui mettra à jour le plugin) juste après avoir retiré le plugin de notre option ;
- Soit ça ne fait pas trois jours, et on renvoie false pour patienter encore.
Si l’extension n’est pas dans notre option deferred_plugin_autoupdates, ou que le numéro de la version à changé : alors on pousse les nouvelles infos (slug, version, et le timestamp courant), et on attend 12H pour réessayer 🙂
Spécifier un délai différent pour certains plugins
Si jamais certains plugins vous paraissent plus sensibles que d’autres, vous avez la possibilité de préciser un délai d’attente un peu plus long.
Pour l’exemple, j’ai un peu peur que trois jours ne suffisent pas aux développeurs de WordPress SEO et Woocommerce pour corriger les retours sur leurs nouvelles versions. Je vais donc créer une variable $delay, qui sera de 10 jours pour ces deux extensions, et de 3 jours pour les autres.
Ensuite, je compare l’âge de la nouvelle version disponible dans l’option deferred_plugin_autoupdates avec cette variable. Si c’est plus vieux, on peut mettre à jour…
Ce code peut être adapté, si vous souhaitez définir plus de deux délais différents, selon les plugins. Il vous faudra alors faire un switch php, rien de sorcier 😉
Désactiver les mises à jour pour une extension
Bon… en fait j’ai eu beau attendre 10 jours avant de mettre à jour Woocommerce, il y a eu tellement de changement dans la nouvelle version de l’extension que ça a tout cassé ! Pour ne pas me faire avoir deux fois je peux simplement dire non à l’auto-update de ce plugin (c’est, là encore, un exemple ; ce n’est pas le genre de Woocommerce d’oublier la retro-compatibilité 😀 ).
Pour faire cela, il suffit, une fois qu’on a récupéré le slug du plugin, de retourner false directement s’il s’agit de woocommerce.
Avec cette astuce, allez-vous franchir le pas et opter pour la mise à jour automatique de vos plugins ?
Dans la section où j’évoque la possibilité de préciser un délai spécifique pour certains plugins, je n’en ai pas parlé mais on peut évidemment préciser un délai court, voir pas du tout de délai 🙂
Petite question, un plugin qui se met automatiquement à jour se désactive ou reste activé ? et s’il se désactive, existe-t-il un moyen de l’auto-activé ? Merci d’avance
j’avoue faire partie du clan des sceptiques en ce qui concerne la MAJ auto. J’avais tendance à vouloir automatiser avant d’entrer en agence et je me suis rendu compte que quand tu gères du code que tu n’as pas créé ce genre d’automatisation est compliquée voire impossible.
Les problèmes peuvent être multiples et nécessitent un audit donc en manuel. Donc ils sont gentils chez WP Tavern mais à confronter à la vie réelle. S’ajoutent que certaines erreurs ne sont pas transparentes et une MAJ peut amener des soucis de perf, etc.
Super article, je ne connaissais pas ou mal ce hook. Après sur le concept je pense que cela ne s’appliquera pas dans certains cas courants.
Je te donne un exemple : alerte WP SEO, faille de sécu. On va essayer de pousser la maj quoi qu’il arrive au plus tôt. Avant on va la tester etc mais on ne peut pas se permettre d’attendre plusieurs jours.
Comment distinguer une MAJ urgente d’une MAJ mineure avec ce code ?
Cela serait utile pourtant…