1.1 Le modèle de découverte

La découverte est la phase où WordPress apprend quelles mises à jour existent. Rien ne s’installe tant que WordPress n’a pas écrit les offres dans les transients du site et que l’interface d’administration ou le programme de mise à jour automatique ne les a pas lus.

Fonctionnement

WordPress sépare la découverte de l’application et du retour d’information. Les fonctions wp_version_check(), wp_update_plugins() et wp_update_themes() cherchent les mises à jour ; elles n’installent rien. Leurs résultats vivent dans les transients de site. L’application repose sur la pile de mise à niveau (voir §2.1). Le retour d’information passe par des notifications, des pastilles, des habillages ou un e-mail selon le chemin d’entrée (voir §4.1–§4.2 et la partie 5).

Déroulement

  1. Un client HTTP contacte WordPress.org ou un autre hôte pour récupérer des métadonnées tierces.
  2. WordPress décode la réponse en objets d’offre.
  3. Le cœur fusionne les offres dans les charges utiles des transients.
  4. Les écrans d’administration et le cron lisent les transients pour décider quoi afficher ou tenter ensuite.
  5. Si la découverte échoue, les transients restent obsolètes ou vides, et le site n’affiche aucune mise à jour avant qu’une vérification ultérieure n’aboutisse.

Référence

ConceptRôle
Fonctions de découverteRemplissent les transients de site update_core, update_plugins et update_themes
ApplicationSous-classes de WP_Upgrader ; la découverte seule ne les appelle pas
Retour d’informationLes transients pilotent l’interface d’administration ; l’e-mail en arrière-plan n’est envoyé qu’après les mises à jour automatiques (voir §4.1)

Ressources pour les développeurs


1.2 Les transients de site : la couche de données des mises à jour

Les transients de site contiennent les derniers résultats de découverte. Quand vous modifiez le comportement des mises à jour, vous manipulez en général ces structures ou les filtres qui les enveloppent.

Fonctionnement

Le cœur met en cache les résultats de découverte dans des transients de site, partagés à l’échelle du réseau sur un multisite. wp_version_check() définit le transient update_core. Ce transient contient le tableau des offres dans updates, plus last_checked, version_checked et d’éventuelles charges utiles de traduction. Les cartes de sommes de contrôle ne sont pas stockées ici : le cœur les récupère à la demande via get_core_checksums() (voir §1.9).

wp_update_plugins() définit le transient update_plugins avec response, no_update, les versions checked et les listes de traductions. wp_update_themes() définit le transient update_themes selon le même schéma, pour les thèmes.

Les filtres dynamiques tels que pre_set_site_transient_{$transient} s’exécutent avant l’enregistrement. Ce filtre est le point d’intégration principal pour ajuster ou vider des structures avant qu’une mise à jour ne s’exécute.

Déroulement

  1. Une fonction de vérification s’exécute et construit ou fusionne une charge utile.
  2. Des filtres peuvent modifier la charge utile avant son enregistrement.
  3. WordPress enregistre la charge utile sous forme de transient de site.
  4. Les lecteurs — écran Mises à jour, wp_get_update_data() et WP_Automatic_Updater — consomment le transient.
  5. Les transients obsolètes persistent jusqu’à la prochaine vérification réussie ou à un rafraîchissement forcé (voir §1.6).

Référence

TransientDéfini parContenu courant
update_corewp_version_check()updates (offres), last_checked, version_checked, traductions
update_pluginswp_update_plugins()response, no_update, checked, traductions
update_themeswp_update_themes()Même schéma pour les thèmes

Ressources pour les développeurs


1.3 Options de politique de branche du cœur (auto_update_core_*)

Les options de site déterminent quelles branches du cœur de WordPress peuvent recevoir des mises à jour automatiques quand la constante WP_AUTO_UPDATE_CORE n’est pas définie dans wp-config.php. Elles fonctionnent de pair avec les filtres et avec le filtre auto_update_core propre à chaque offre (voir §3.7).

Fonctionnement

Quand WP_AUTO_UPDATE_CORE n’est pas définie, le cœur lit les options de site dans la logique de politique de branche de Core_Upgrader::should_update_to_version(). Les valeurs sont en général enabled, disabled ou non définies, avec des valeurs par défaut issues du schéma et de l’interface d’administration. Ces options vivent dans la table des options (options de site sur un multisite) : elles ne sont pas stockées dans les transients de mise à jour. Pour l’ordre de priorité avec WP_AUTO_UPDATE_CORE et les filtres, voir §5.10 et §3.7.

Déroulement

  1. Le cœur évalue la branche de la version en cours : développement, mineure ou majeure.
  2. Le cœur lit l’option auto_update_core_* correspondante, sauf si la constante impose la politique.
  3. Les filtres de branche peuvent modifier le résultat booléen.
  4. Le résultat alimente should_update() avec l’offre et les autres garde-fous.

Référence

NomTypeValeur par défautEffet
auto_update_core_devoption de siteselon le schémaVersions de développement ou de type nightly sur la branche en cours
auto_update_core_minoroption de siteselon le schémaVersions mineures dans la même branche x.y
auto_update_core_majoroption de siteselon le schémaVersions majeures ; l’interface de WordPress 5.6 et suivantes associe les choix à cette option

Ressources pour les développeurs


1.4 Les indicateurs d’offre autoupdate et disable_autoupdate

Les réponses de l’API attachent des indicateurs à chaque offre. Ces indicateurs déterminent si un élément est candidat à une mise à jour non assistée, avant l’exécution des filtres par élément.

Fonctionnement

Quand WordPress.org répond à une requête de vérification de mise à jour d’une extension ou d’un thème, chaque entrée de la carte de réponse est un objet d’offre. Les extensions et les thèmes dotés d’un en-tête Update URI peuvent recevoir des offres de update_plugins_{$hostname} ou update_themes_{$hostname} à la place ; ces objets peuvent aussi contenir autoupdate et disable_autoupdate.

Un booléen autoupdate signale que la version est éligible à une mise à jour automatique non assistée, du point de vue de l’annuaire ou du fournisseur tiers. Dans WP_Automatic_Updater::should_update(), pour les extensions et les thèmes, le cœur initialise d’abord la décision en attente à partir de autoupdate, puis fusionne les adhésions par élément stockées dans les options de site (auto_update_plugins, auto_update_themes) quand les mises à jour automatiques sont actives pour ce type. Si autoupdate est vide et que l’administrateur du site n’a pas adhéré pour cet élément, la décision en attente reste fausse.

La propriété disable_autoupdate force la décision en attente à faux avant l’exécution de apply_filters( "auto_update_{$type}", … ), mais le filtre peut encore renvoyer vrai pour réactiver la mise à jour.

Ces indicateurs ne sont pas des réglages durables du site. Ils arrivent à chaque réponse HTTP ou depuis un rappel de filtre. Le transient stocke ce que la dernière vérification a renvoyé. Rafraîchissez les offres avec wp_update_plugins() ou wp_update_themes() avant de fonder une politique sur les objets d’offre.

Déroulement

  1. La découverte renvoie des offres, chacune portant éventuellement les indicateurs autoupdate et disable_autoupdate.
  2. should_update() combine ces indicateurs avec les tableaux d’adhésion et les filtres.
  3. Un résultat faux écarte l’installation automatique pour cet élément, sauf si un filtre impose la décision.

Référence

IndicateurSignification
autoupdateL’annuaire, le fournisseur d’Update URI tiers ou l’auteur signale l’éligibilité à la mise à jour automatique
disable_autoupdateMet l’élément en veto avant l’exécution de auto_update_{$type} ; les filtres peuvent passer outre

Ressources pour les développeurs

1.5 Les vérifications planifiées (WP-Cron)

WordPress planifie des vérifications récurrentes pour que la découverte tourne sans utilisateur connecté. Vous devez connaître le comportement du cron quand DISABLE_WP_CRON ou un ordonnanceur externe remplace le mécanisme par défaut.

Fonctionnement

wp_schedule_update_checks() s’exécute sur init et planifie trois événements biquotidiens : wp_version_check appelle wp_version_check(), wp_update_plugins appelle wp_update_plugins() et wp_update_themes appelle wp_update_themes().

Quand DISABLE_WP_CRON vaut vrai, WordPress ne lance plus le moteur de cron au chargement normal des pages. Les crochets planifiés — dont wp_version_check, wp_update_plugins, wp_update_themes et, par enchaînement, wp_maybe_auto_update — ne s’exécutent pas, sauf si quelque chose appelle wp-cron.php (cron système, supervision ou WP-CLI). Les vérifications déclenchées depuis l’administration décrites en §1.6 continuent de tourner sur ces requêtes, car elles ne passent pas par le cron.

Déroulement

  1. Le crochet init planifie les événements s’ils ne le sont pas déjà.
  2. À chaque passage du cron, les événements dus se déclenchent.
  3. Chaque gestionnaire appelle la fonction de mise à jour correspondante.
  4. La limitation interne de ces fonctions peut éviter la requête HTTP si une vérification récente est encore valide, sauf si l’appelant force un rafraîchissement (§1.6).
  5. En cas d’échec, les transients restent inchangés jusqu’au prochain passage réussi.

Référence

CrochetTypeParamètresRemarques
wp_version_checkévénement cronAppelle wp_version_check()
wp_update_pluginsévénement cronAppelle wp_update_plugins()
wp_update_themesévénement cronAppelle wp_update_themes()

Ressources pour les développeurs


1.6 Vérifications déclenchées depuis l’administration et contournement de la limitation

Charger certains écrans d’administration force des vérifications plus fraîches, avec des délais d’attente plus courts que les longs reports par défaut. Si vous ajoutez un contrôle « Rechercher des mises à jour », reprenez ces schémas.

Fonctionnement

Des crochets sur les écrans d’administration tels que load-plugins.php, load-update.php et load-update-core.php déclenchent des vérifications d’extensions ou de thèmes avec des délais dépendants du contexte. L’écran Mises à jour utilise un report d’environ une minute, les listes environ une heure, et le report par défaut environ 12 heures.

_maybe_update_plugins() et _maybe_update_themes() sur admin_init appliquent un report de 12 heures quand last_checked est récent. _maybe_update_core() n’applique cette même fenêtre de 12 heures que si le champ version_checked du transient correspond encore à la version de WordPress en cours ; si les versions diffèrent, la vérification part immédiatement.

wp_version_check() accepte un second paramètre $force_check. Quand il vaut vrai, la fonction ignore le délai d’attente lié au transient update_core stocké et lance une nouvelle requête HTTP. wp_update_plugins() et wp_update_themes() acceptent $extra_stats ; quand ce tableau n’est pas vide, le retour anticipé pour « vérifié récemment et rien n’a changé » est ignoré, ce qui revient à une vérification forcée. Un premier argument non vide passé à wp_version_check() peut aussi activer $force_check en interne, d’après wp-includes/update.php.

Remarque : ne forcez pas les vérifications à chaque passage du cron ou à chaque requête d’arrière-plan. Réservez les vérifications forcées aux actions lancées par un utilisateur ou aux tâches peu fréquentes, pour éviter les requêtes excessives vers WordPress.org.

Déroulement

  1. Un écran d’administration se charge et ses crochets de chargement s’exécutent.
  2. Les fonctions de mise à jour tournent avec des délais courts, ou avec $force_check et des statistiques supplémentaires non vides.
  3. La requête HTTP renvoie de nouvelles offres.
  4. WordPress rafraîchit les transients.
  5. L’interface affiche les nouveaux compteurs de mises à jour.
  6. Si l’utilisateur n’a pas les capacités suffisantes, WordPress affiche un message limité.

Référence

FonctionFichierRetourRemarques
wp_version_check()wp-includes/update.phpvoidPassez $force_check à vrai pour ignorer le report lié au transient du cœur
wp_update_plugins()wp-includes/update.phpvoidUn $extra_stats non vide contourne le chemin « vérifié récemment »
wp_update_themes()wp-includes/update.phpvoidUn $extra_stats non vide contourne le chemin « vérifié récemment »
wp_clean_update_cache()wp-includes/update.phpvoidVide les transients ; à combiner avec une vérification quand vous voulez une nouvelle requête HTTP

Ressources pour les développeurs


1.7 Les points de terminaison de l’API

La découverte dépend de points de terminaison HTTP qui renvoient des offres au format JSON. La disponibilité de SSL influe sur le transport et sur les avertissements.

Fonctionnement

Le cœur envoie des requêtes POST aux points de terminaison de vérification de version et de mises à jour de WordPress.org. Les URL dans le code source utilisent http:// ; quand wp_http_supports( array( 'ssl' ) ) renvoie vrai, WordPress passe le schéma en HTTPS.

La vérification de version du cœur envoie des paramètres de chaîne de requête plus un corps POST qui contient les traductions encodées. Les vérifications d’extensions et de thèmes envoient des corps JSON listant les composants et les locales installés. Un point de terminaison distinct fournit les sommes de contrôle, pour la seule vérification d’intégrité, sans offres de mise à jour (voir §1.9). Quand SSL n’est pas disponible, le cœur peut retomber en HTTP avec des avertissements visibles sur certains chemins d’échec.

Déroulement

  1. Une fonction de mise à jour construit le corps de la requête.
  2. WordPress envoie une requête POST au point de terminaison.
  3. WordPress décode la réponse.
  4. En cas d’erreur, les transients peuvent rester obsolètes ou WordPress déclenche un comportement de repli.
  5. En cas de succès, WordPress met à jour les charges utiles des transients.

Référence

Chemin d’URL sur api.wordpress.orgMéthodeObjet
/core/version-check/1.7/POSTOffres du cœur ; arguments de requête plus corps (dont les traductions)
/plugins/update-check/1.1/POSTOffres par extension
/themes/update-check/1.1/POSTOffres par thème
/core/checksums/1.0/GETCarte chemin-vers-empreinte pour une version et une locale (§1.9)

Ressources pour les développeurs


1.8 Les sources de mise à jour tierces (Update URI)

Les extensions et les thèmes peuvent déclarer un en-tête Update URI pour que les métadonnées arrivent d’un autre hôte que WordPress.org. Cela étend la découverte sans remplacer le modèle de transients du cœur.

Fonctionnement

Pour les extensions et les thèmes qui déclarent Update URI, le cœur applique les filtres dynamiques update_plugins_{$hostname} et update_themes_{$hostname}. Ce mécanisme permet aux annuaires commerciaux ou sur mesure de fournir des métadonnées de mise à jour. Les préférences d’interface de mise à jour automatique par entité sont stockées dans les options de site ; elles sont décrites en §5.4 et §3.8.

Déroulement

  1. La découverte s’exécute.
  2. Le cœur résout le nom d’hôte à partir de l’en-tête Update URI.
  3. Le filtre correspondant peut injecter ou modifier des offres.
  4. WordPress fusionne les résultats dans les transients de site habituels.
  5. La logique du programme de mise à jour automatique décrite dans la partie 3 utilise ces offres comme les autres.

Référence

CrochetTypeParamètresRemarques
update_plugins_{$hostname}filtrevariablesOffres d’extensions tierces
update_themes_{$hostname}filtrevariablesOffres de thèmes tiers

Ressources pour les développeurs


1.9 Vérification de l’intégrité du cœur (sommes de contrôle)

La vérification par sommes de contrôle compare les fichiers installés aux empreintes attendues pour une version donnée de WordPress. Elle sert au diagnostic et aux outils en ligne de commande. Elle ne filtre pas le programme de mise à jour automatique avant l’exécution des mises à jour automatiques. La vérification des signatures de paquets sur les fichiers ZIP téléchargés avant l’installation est un mécanisme distinct (§2.12).

Fonctionnement

L’API de sommes de contrôle de WordPress.org renvoie du JSON dont l’entrée checksums associe des chemins de fichiers relatifs à des empreintes attendues, pour une version du cœur et une locale. Le cœur récupère cette carte via get_core_checksums() dans wp-admin/includes/update.php.

Core_Upgrader::check_files() dans wp-admin/includes/class-core-upgrader.php charge les sommes de contrôle et compare la sortie de md5_file() à chaque empreinte attendue, en ignorant les chemins sous wp-content/. Santé du site et les chemins de mise à niveau peuvent utiliser la même API. Le transient de découverte update_core n’embarque pas la carte des sommes de contrôle : le cœur la récupère séparément quand il en a besoin.

La commande WP-CLI wp core verify-checksums effectue un contrôle d’intégrité comparable depuis la ligne de commande. Cette vérification est un audit d’intégrité. Elle ne correspond pas aux contrôles de signature de paquet Ed25519 sur les fichiers ZIP téléchargés (§2.12) et ne sert pas de barrière générale avant vol pour WP_Automatic_Updater.

Déroulement

  1. Un outil ou une fonction demande les sommes de contrôle pour une version et une locale précises.
  2. Le cœur compare les fichiers installés à la carte d’empreintes.
  3. Une différence indique des fichiers du cœur modifiés ou manquants.
  4. Le résultat informe les administrateurs, mais ne pilote pas à lui seul la chaîne du programme de mise à jour automatique.

Référence

FonctionFichierRetourRemarques
get_core_checksums()wp-admin/includes/update.phparray<string, string> ou falseRécupère la carte chemin-vers-empreinte ; renvoie false en cas d’échec
Core_Upgrader::check_files()wp-admin/includes/class-core-upgrader.phpboolCompare les fichiers d’ABSPATH à la carte

Ressources pour les développeurs


1.10 Les exclusions : extensions obligatoires et drop-ins

Les extensions obligatoires et les drop-ins vivent en dehors des chaînes habituelles de découverte des extensions et des thèmes. Ils n’apparaissent jamais dans les charges utiles de vérification de mise à jour de WordPress.org et ne sont pas mis à niveau par l’interface de mise à jour standard ni par les chemins du programme de mise à jour automatique destinés aux extensions et thèmes ordinaires.

Fonctionnement

Les extensions obligatoires se chargent depuis wp-content/mu-plugins/ (et les fichiers PHP imbriqués, là où c’est pris en charge). Le cœur ne les énumère pas comme les extensions ordinaires de wp-content/plugins/, donc wp_update_plugins() ne récupère pas d’offres les concernant depuis WordPress.org.

Les drop-ins (par exemple advanced-cache.php, db.php et object-cache.php) sont des fichiers isolés ou de petits ensembles de fichiers placés directement sous wp-content/ et recensés par get_dropins(). Ils ne sont pas empaquetés comme des extensions en dossier ; le cœur n’a pas de flux intégré pour « mettre à jour ce drop-in depuis l’annuaire ».

Remplacer une extension obligatoire ou un drop-in demande un déploiement manuel de fichiers, une chaîne de déploiement sur mesure ou des outils extérieurs aux mécanismes de mise à jour natifs.

Déroulement

  1. La découverte s’exécute pour les extensions et les thèmes standards.
  2. Les extensions obligatoires et les drop-ins sont exclus du modèle d’offres.
  3. Un administrateur ou un outil d’automatisation copie les nouveaux fichiers dans mu-plugins/ ou wp-content/ (souvent via un système de gestion de versions ou une chaîne CI/CD).
  4. Le cœur n’enregistre aucune métadonnée de version pour ces composants dans les transients de mise à jour.
  5. Les extensions obligatoires continuent de se charger tôt au démarrage ; les drop-ins prennent effet quand ils sont présents et valides.

Référence

ArtefactDécouverteApplication
Extensions obligatoiresNon listées dans le flux standard de l’API de mise à jour des extensionsDéploiement manuel ou externe
Drop-insNon listés comme paquets installablesDéploiement manuel ou externe

Ressources pour les développeurs


Auteur

Photo de Quentin Le Duff

Quentin Le Duff

Quentin Le Duff est développeur WordPress depuis dix ans, certifié Opquast® Expert & ISTQB. Il travaille avec WordPress au quotidien : développement d’extensions open source et de thèmes, hébergement et maintenance des sites de ses clients, et rédaction sur l’écosystème WP.