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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *