# Masquer certaines extensions de la liste des mises à jour pour un client

> Filtrer l'écran des mises à jour disponibles évite qu'un client déclenche seul la mise à jour d'une extension sensible, sans bloquer les autres.

- Auteur : Clément Hadrot
- Publié le : 2025-09-23
- Mis à jour le : 2025-09-23
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/masquer-extensions-liste-mises-a-jour-client/

## L’essentiel

- Le transitoire update_plugins concentre toutes les mises à jour connues
- Retirer une entrée du tableau response, pas la bloquer entièrement
- Toujours garder trace de ce qui est masqué et pourquoi

Une agence gérant une vingtaine de sites clients avait un cas particulier récurrent : sur certains projets, une extension de paiement personnalisée nécessitait une procédure de mise à jour manuelle coordonnée avec le prestataire de paiement, jamais une mise à jour en un clic depuis l'administration. Le client, voyant l'extension listée parmi les autres mises à jour disponibles, la mettait parfois à jour de sa propre initiative, provoquant une rupture temporaire du tunnel de paiement.

Plutôt que de désactiver totalement les mises à jour automatiques pour tout le site (ce qui aurait aussi bloqué les correctifs de sécurité des autres extensions), la solution consiste à filtrer précisément l'entrée correspondant à cette seule extension dans les données que WordPress affiche.

## Où vivent les informations de mise à jour

WordPress stocke les informations de mise à jour disponibles pour les extensions dans un transitoire nommé `update_plugins`, actualisé périodiquement par une requête vers WordPress.org (ou vers un serveur de mise à jour personnalisé pour une extension premium). Ce transitoire est accessible et modifiable via le filtre `site_transient_update_plugins`, qui reçoit l'objet complet avant qu'il ne soit utilisé pour générer l'écran d'administration :

```
add_filter( 'site_transient_update_plugins', function ( $transitoire ) {
    if ( empty( $transitoire->response ) ) {
        return $transitoire;
    }

    $chemin_extension = 'paiement-personnalise/paiement-personnalise.php';

    if ( isset( $transitoire->response[ $chemin_extension ] ) ) {
        unset( $transitoire->response[ $chemin_extension ] );
    }

    return $transitoire;
} );
```

## Pourquoi retirer l'entrée plutôt que la neutraliser autrement

> L'essentiel à retenir : Le transitoire update_plugins concentre toutes les mises à jour connues ; Retirer une entrée du tableau response, pas la bloquer entièrement ; Toujours garder trace de ce qui est masqué et pourquoi

La propriété `response` de ce transitoire contient uniquement les extensions pour lesquelles une nouvelle version est disponible. En retirer l'entrée correspondant à l'extension sensible fait disparaître la mise à jour de l'écran `Mises à jour`, de la liste des extensions, et du badge de notification dans le menu d'administration — sans toucher à aucune autre extension du site, ni empêcher l'extension elle-même de fonctionner normalement.

Une alternative parfois vue consiste à désactiver `plugin_action_links` ou à masquer visuellement la ligne avec du CSS : ces approches ne font que cacher l'information à l'écran, sans empêcher WordPress de proposer malgré tout la mise à jour via WP-CLI ou l'API REST. Filtrer directement le transitoire ferme la porte à ces deux canaux également.

### Trouver le chemin exact de l'extension

Le format attendu (`dossier/fichier-principal.php`) correspond au chemin relatif utilisé en interne par WordPress pour identifier chaque extension, visible dans la colonne technique de l'écran `Extensions` ou via `WP_PLUGIN_DIR`. Une erreur fréquente consiste à ne renseigner que le nom du dossier sans le fichier principal, ce qui fait échouer silencieusement le filtre : la comparaison de clé de tableau ne trouve alors jamais de correspondance.

## Rendre la restriction configurable par site

Sur une agence qui gère plusieurs sites avec des besoins différents, il vaut mieux éviter de coder en dur le chemin de l'extension dans un mu-plugin partagé entre tous les sites. Une constante définie dans le `wp-config.php` de chaque site concerné rend la restriction explicite et localisée :

```
// Dans wp-config.php du site concerné uniquement
define( 'EXTENSIONS_MASQUEES_MAJ', array( 'paiement-personnalise/paiement-personnalise.php' ) );
```

```
// Dans un mu-plugin partagé
add_filter( 'site_transient_update_plugins', function ( $transitoire ) {
    if ( ! defined( 'EXTENSIONS_MASQUEES_MAJ' ) || empty( $transitoire->response ) ) {
        return $transitoire;
    }

    foreach ( EXTENSIONS_MASQUEES_MAJ as $chemin ) {
        unset( $transitoire->response[ $chemin ] );
    }

    return $transitoire;
} );
```

## Garder une trace de ce qui est masqué

Le vrai risque de cette technique n'est pas technique mais organisationnel : une extension masquée finit facilement par être oubliée, et sa mise à jour manuelle coordonnée n'a jamais lieu. Un rappel dans le tableau de bord de l'administration, visible pour l'équipe technique de l'agence (pas pour le client), évite cet oubli :

```
add_action( 'admin_notices', function () {
    if ( ! defined( 'EXTENSIONS_MASQUEES_MAJ' ) || ! current_user_can( 'manage_options' ) ) {
        return;
    }

    echo '<div class="notice notice-info"><p>Rappel agence : ' . count( EXTENSIONS_MASQUEES_MAJ ) . ' extension(s) masquée(s) des mises à jour automatiques sur ce site. Vérifiez leur statut manuellement chaque trimestre.</p></div>';
} );
```

## Ce que cette technique ne doit jamais remplacer

- Elle ne dispense pas d'un suivi manuel régulier des versions disponibles pour l'extension masquée, notamment côté sécurité.
- Elle ne doit jamais servir à masquer une extension par simple confort, sans procédure de suivi alternative en place.
- Elle n'empêche pas une mise à jour manuelle explicite via téléversement direct du fichier, ce qui reste la voie normale pour ce cas précis.

> Sur les projets où une extension nécessite une procédure de mise à jour coordonnée avec un tiers, je documente toujours ce filtre dans le wiki interne de l'agence, avec la date de la dernière vérification manuelle : sans ce suivi écrit, l'extension masquée finit par être oubliée jusqu'à ce qu'un incident de sécurité la remette en lumière.

## En résumé

Filtrer précisément une entrée du transitoire `update_plugins` permet de retirer une seule extension du circuit de mise à jour visible par le client, sans compromettre la sécurité globale du site en désactivant toutes les autres mises à jour. C'est une solution ciblée, à réserver aux cas où une procédure de mise à jour manuelle réellement suivie existe en remplacement.
