Catégories
DĂ©veloppement WordPress

🛠Hooks et fonctions pour contrîler l’interface de mise à jour automatiques des thùmes et extensions sur WordPress 5.5

Voici un tour d’horizon des fonctionnalitĂ©s permettant de hooker l’interface des mises Ă  jour automatiques des thĂšmes et extensions sur votre site WordPress. Cette fonctionnalitĂ© est assez importante pour moi dans la mesure oĂč je me suis occupĂ© de diriger son dĂ©veloppement pendant 6 mois, avec l’aide de Paul Biron. Je vais m’efforcer d’en faire un tour complet pour les dĂ©veloppeuses et dĂ©veloppeurs. L’article en français destinĂ© aux administrateur·ice·s (donc non technique) de sites sortira quant Ă  lui sur fr.wordpress.org.

Cet article est une traduction en français de la dev note – note Ă  destination des dĂ©veloppeur·euse·s â€“ que j’ai publiĂ© sur le blog de dĂ©veloppement de WordPress (en anglais).

La sĂ©curitĂ© est Ă©videmment un enjeu de taille pour un site internet. Conserver son site Ă  jour avec la derniĂšre version de WordPress, de PHP, ou des thĂšmes et extensions installĂ©es (mĂȘme si elles ne sont pas actives !) est hautement recommandé  voire tout simplement obligatoire. Les mises Ă  jour sont le meilleur moyen de se prĂ©munir de toute vulnĂ©rabilitĂ© connue sur un thĂšme ou sur une extension.

Par dĂ©faut, WordPress est configurĂ© pour se mettre Ă  jour automatiquement lorsqu’une mise Ă  jour mineure est disponible. Le code permettant la mise Ă  jour automatique des extensions et des thĂšmes est disponible depuis longtemps, mais ce code est rarement utilisĂ© par les personnes administrant des sites WordPress car cela demande l’utilisation de crochets et de filtres.

En fĂ©vrier dernier, une extension de fonctionnalitĂ© a Ă©tĂ© crĂ©Ă©e pour faire suite Ă  un article listant les 9 projets pour 2019/2020. Cette extension avait pour but d’explorer l’introduction d’une interface permettant aux administrateur·ice·s de sites de gĂ©rer facilement les mises Ă  jour automatiques des thĂšmes et des extensions Ă  partir du tableau de bord de leur site WordPress.

AprĂšs 5 mois de dĂ©veloppement sur le dĂ©pĂŽt GitHub ouvert pour que nous puissions gĂ©rer ce projet, aprĂšs de nombreux retours de la part des utilisateurs et utilisatrices (l’extension Ă©tant disponible sur le rĂ©pertoire des extensions WordPress.org, aprĂšs de nombreux tests en situation (l’extension est actuellement installĂ©e et activĂ©e sur plus de 1000 installations WordPress distinctes), et de nombreuses itĂ©rations de la part de l’équipe #core-auto-updates, cette nouvelle fonctionnalitĂ© a finalement Ă©tĂ© mergĂ©e dans WordPress 5.5 il y a quelques semaines et sera disponible pour tout le monde Ă  partir du 11 aoĂ»t, date de sortie de WP 5.5 ⭐

Capture d’écran de l’écran de gestion des extensions d’un site, avec la nouvelle colonne de gestion des mises Ă  jour automatiques (cliquer pour agrandir).

À noter : les mises Ă  jour automatiques des thĂšmes et des extensions sont dĂ©sactivĂ©es par dĂ©faut. Les administrateurs et administratrices de sites doivent activer cette fonctionnalitĂ© thĂšme par thĂšme et extension par extension.

Ces nouveaux Ă©lĂ©ments d’interface permettent aux propriĂ©taires de sites de conserver leurs sites Ă  jour de version et sĂ©curisĂ©s, de façon automatisĂ©e.

Par dĂ©faut, tous les utilisateurs et utilisatrices ayant les permissions update_plugins ou update_themes peuvent activer les mises Ă  jour automatiques. Sur les installations multisite, seulement les rĂŽles d’admin du rĂ©seau disposent de ces permissions, et uniquement dans le contexte du tableau de bord du rĂ©seau.

Plusieurs crochets (hooks) sont disponibles pour les dĂ©veloppeurs et dĂ©veloppeuses, afin de pouvoir personnaliser la fonctionnalitĂ© Ă  leur guise. Dans cet article, vous trouverez toutes les fonctions et crochets disponibles pour modifier les Ă©lĂ©ments d’interface des mises Ă  jour automatiques des thĂšmes et extensions.

🔎 VĂ©rifier si les mises Ă  jour auto sont activĂ©es pour une extension ou un thĂšme

Cette fonction indique si les mises Ă  jour auto sont actives pour un certain type d’élĂ©ment. Les deux types disponibles sont theme et plugin.


// VĂ©rifier si les mises Ă  jour auto sont actives pour les extensions
$plugin_auto_updates_enabled = wp_is_auto_update_enabled_for_type( 'plugin' );
 

đŸ’„ DĂ©sactivation des Ă©lĂ©ments d’interface des mises Ă  jour auto

Il est possible de dĂ©sactiver tous les Ă©lĂ©ments d’interface des mises Ă  jour auto si nĂ©cessaire. Si vous retournez false aux filtres plugins_auto_update_enabled et themes_auto_update_enabled, les Ă©lĂ©ments d’interface permettant de gĂ©rer la mises Ă  jour automatique des extensions et des thĂšmes ne seront pas affichĂ©s. Par dĂ©faut, la valeur utilisĂ©e est true et les Ă©lĂ©ments d’interface sont donc affichĂ©s.

À noter : ceci ne permet pas d’activer ou dĂ©sactiver la fonctionnalitĂ© de mise Ă  jour automatique mais uniquement d’afficher ou de ne pas afficher les Ă©lĂ©ments d’interface permettant d’activer ou dĂ©sactiver les mises Ă  jour auto.

Le bout de code suivant permet de dĂ©sactiver l’affichage des Ă©lĂ©ments d’interface permettant de gĂ©rer la mise Ă  jour automatique des extensions et des thĂšmes :

// DĂ©sactivation de l'interface de mise Ă  jour auto des extensions.
add_filter( 'plugins_auto_update_enabled', '__return_false' );

// DĂ©sactivation de l'interface de mise Ă  jour auto des thĂšmes.
add_filter( 'themes_auto_update_enabled', '__return_false' );

🔧 Modification des liens d’action des mises à jour auto

Parfois, une extension ou un thĂšme pourrait juger nĂ©cessaire de gĂ©rer lui mĂȘme ses mises Ă  jour. Cela est plutĂŽt courant pour les extensions/thĂšmes qui ne sont pas hĂ©bergĂ©s sur le dĂ©pĂŽt officiel WordPress.org. Dans ce cas, il existe des filtres qui permettent aux dĂ©veloppeurs et dĂ©veloppeuses de modifier le rendu HTML de la fonctionnalitĂ© sur plusieurs emplacements.

🔌 Écran des extension: sites simples et multisites

Avec le filtre plugin_auto_update_setting_html, il est possible de filtrer le contenu de la colonne de mise Ă  jour auto des extensions. Cela inclut l’ensemble du contenu de la colonne, y compris le lien d’activation/dĂ©sactivation et l’affichage du temps Ă  attendre jusqu’à la prochaine mise Ă  jour.

Ce filtre passe en variable le HTML gĂ©nĂ©rĂ© par dĂ©faut, ainsi que deux paramĂštre additionnels :

  • $plugin_file: Le chemin du fichier principal de l’extension, relatif par rapport au rĂ©pertoire des extensions sur l’installation WP.
  • $plugin_data: Un tableau contenant les donnĂ©es de l’extension.

Par exemple, disons que l’extension « Mon Extension Â» souhaite Ă©viter que les mises Ă  jour auto soient activĂ©es et que son chemin relatif au rĂ©pertoire des extensions soit mon-extension/mon-extension.php. L’exemple suivant modifie ce qui s’affiche dans la colonne de mise Ă  jour automatique uniquement pour cette extension.

function myplugin_auto_update_setting_html( $html, $plugin_file, $plugin_data ) {
	if ( 'my-plugin/my-plugin.php' === $plugin_file ) {
		$html = __( 'Auto-updates are not available for this plugin.', 'my-plugin' );
	}

	return $html;
}
add_filter( 'plugin_auto_update_setting_html', 'myplugin_auto_update_setting_html', 10, 3 );

Voici le rĂ©sultat obtenu :

Dans cette capture d’écran, le bouton d’activation des mises Ă  jour automatiques est remplacĂ© par un texte indiquant que la fonctionnalitĂ© n’est pas disponible pour cette extension (cliquer pour agrandir).

Pour rĂ©fĂ©rence, voici le rendu HTML gĂ©nĂ©rĂ© par dĂ©faut :

<a href="
" class="toggle-auto-update" data-wp-action="
">
	<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span>
	<!-- The following text is replaced with "Disable auto-updates" when auto-updates are already enabled for this plugin -->
	<span class="label">Enable auto-updates</span>
</a>

🎹 Écran des thĂšmes : sites simples uniquement (hors multisite)

Le filtrage du contenu HTML des mises Ă  jour auto sur l’écran des thĂšmes est un peu plus compliquĂ©, car cet Ă©cran est rendu Ă  l’aide d’un template JavaScript. Cependant, il est possible de hooker cet Ă©cran en utilisant le filtre theme_auto_update_setting_template et en retournant un contenu modifiĂ© pour la variable $template (cette variable contient le template rendu pour chaque thĂšme de l’écran de gestion des thĂšmes).

À noter : comme ce template est utilisĂ© pour tous les thĂšmes de l’écran, il est nĂ©cessaire d’utiliser une condition pour vĂ©rifier que le thĂšme pour lequel vous modifiez le rendu HTML est bien le bon. Sinon, votre changement s’appliquera pour tous les thĂšmes. Vous pouvez effectuer cette vĂ©rification en utilisant le paramĂštre JS data.id, qui contient le slug du thĂšme.

Toute la documentation sur les propriĂ©tĂ©s disponibles dans l’objet data est disponible dans la documentation de la fonction wp_prepare_themes_for_js() (en anglais).

L’exemple suivant remplace le contenu HTML de l’élĂ©ment d’interface des mises Ă  jour auto pour les thĂšmes mon-theme et twentytwenty.

function myplugin_auto_update_setting_template( $template ) {
	$text = __( 'Auto-updates are not available for this theme.', 'my-plugin' );

	return "<# if ( [ 'my-theme', 'twentytwenty' ].includes( data.id ) ) { #>
		<p>$text</p>
		<# } else { #>
		$template
		<# } #>";
}
add_filter( 'theme_auto_update_setting_template', 'myplugin_auto_update_setting_template' );

Voici le rĂ©sultat pour le thĂšme Twenty Twenty :

Dans cette capture d’écran, le bouton d’activation des mises Ă  jour automatiques est remplacĂ© par un texte indiquant que la fonctionnalitĂ© n’est pas disponible pour ce thĂšme (cliquer pour agrandir).

Pour rĂ©fĂ©rence, voici le HTML/JS rendu par dĂ©faut :

<div class="theme-autoupdate">
	<# if ( data.autoupdate ) { #>
		<a href="{{{ data.actions.autoupdate }}}" class="toggle-auto-update" data-slug="{{ data.id }}" data-wp-action="disable">
			<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span>
			<span class="label">' . __( 'Disable auto-updates' ) . '</span>
		</a>
	<# } else { #>
		<a href="{{{ data.actions.autoupdate }}}" class="toggle-auto-update" data-slug="{{ data.id }}" data-wp-action="enable">
			<span class="dashicons dashicons-update spin hidden" aria-hidden="true"></span>
			<span class="label">' . __( 'Enable auto-updates' ) . '</span>
		</a>
	<# } #>
	<# if ( data.hasUpdate ) { #>
		<# if ( data.autoupdate ) { #>
			<span class="auto-update-time">
		<# } else { #>
			<span class="auto-update-time hidden">
		<# } #>
		<br />' . wp_get_auto_update_message() . '</span>
	<# } #>
	<div class="notice notice-error notice-alt inline hidden"><p></p></div>
</div>

🎹 Écran des thĂšmes : installation multisite

Sur les installations multisites, l’écran de gestion des thĂšmes peut ĂȘtre modifiĂ© de façon similaire Ă  l’écran des extensions dĂ©crit plus haut. Il suffit d’utiliser le filtre theme_auto_update_setting_html. Cela inclut l’ensemble du contenu HTML, y compris le lien d’activation/dĂ©sactivation et l’affichage du temps Ă  attendre jusqu’à la prochaine mise Ă  jour.

Ce filtre passe en variable le HTML gĂ©nĂ©rĂ© par dĂ©faut, ainsi que deux paramĂštre additionnels :

  • $stylesheet : le nom du rĂ©pertoire contenant le thĂšme (autrement dit, son slug).
  • $theme : l’objet complet WP_Theme.

Par exemple, disons que l’administrateur·ice d’un rĂ©seau multisite souhaite dĂ©sactiver l’interface de gestion des mises Ă  jour automatiques pour le thĂšme Twenty Twenty. Le bout de code suivant peut ĂȘtre utilisĂ© :

function myplugin_theme_auto_update_setting_html( $html, $stylesheet, $theme ) {
	if ( 'twentytwenty' === $stylesheet ) {
		$html = __( 'Auto-updates are not available for this theme.', 'my-plugin' );
	}

	return $html;
}
add_filter( 'theme_auto_update_setting_html', 'myplugin_theme_auto_update_setting_html', 10, 3 );

🧹 Activer la mise Ă  jour automatique de toutes les extensions et de tous les thĂšmes, y compris ceux qui seront installĂ©s dans le futur

Si vous souhaitez activer les mises à jour automatiques pour tous les thÚmes et extensions WordPress actuellement installées et qui seront installées dans le futur, vous pouvez utiliser les filtres auto_update_plugin et auto_update_theme filters.

// Activer par défaut les mises à jour auto pour les extensions.
add_filter( 'auto_update_plugin', '__return_true' );

// Activer par défaut les mises à jour auto pour les thÚmes.
add_filter( 'auto_update_theme', '__return_true' );

À noter : toute valeur retournĂ©e en utilisant ces filtres surchargera les rĂ©glages faits sur les Ă©crans d’administration du site. Par dĂ©faut, les modifications faites sur ces filtres ne modifieront pas l’interface de gestion des mises Ă  jour auto en back-office. Il est donc grandement recommandĂ© d’utiliser ces filtres en combinaison avec les crochets d’action et filtres dĂ©taillĂ©s plus haut afin de ne pas afficher l’interface par dĂ©faut.

Cette approche d’activation automatique n’est pas forcĂ©ment la plus recommandĂ©e, c’est Ă  vous d’en juger en tant que gestionnaire de sites.

À noter Ă©galement : ce filtre n’est pas nouveau ! Il a Ă©tĂ© introduit dans la version 3.7 de WordPress. D’ailleurs, si vous l’utilisez dĂ©jĂ , cela pourrait expliquer que les Ă©lĂ©ments d’interface de mise Ă  jour automatique des thĂšmes et des extensions ne fonctionnent pas sur WordPress 5.5.


Si vous avez des questions, n’hĂ©sitez pas Ă  laisser un petit commentaire ci-dessous. Si cet article vous a Ă©tĂ© utile, n’hĂ©sitez pas Ă  le dire dans les commentaires aussi, ça fait toujours plaisir 😍
Et si ça vous a vraiment Ă©tĂ© super utile, vous pouvez aussi m’offrir une biĂšre đŸ»đŸ˜„

Dans un prochain article, nous verrons comment hooker les notifications e-mail envoyées lors des mises à jour automatiques.

Pour plus d’information, consultez les tickets liĂ©s Ă  cette Ă©volution sur Trac : #50052 et #50280.

WordPress 5.5 sortira le 11 aoĂ»t 2020. Pour tester dĂšs Ă  prĂ©sent cette nouvelle version, vous pouvez installer l’extension WordPress Beta Tester sur une installation de test.

Illustration d’entĂȘte: Laboratoire de Raoul Pictet Ă  l’exposition universelle de Paris de 1878, gravure par Ch. Baude, disponible sur Wikimedia Commons

Mentions légales