📦 CatalogueIntermédiaire PS 1.5 PS 1.6 PS 1.7 PS 8.x

Mise à jour massive de id_category_default : pourquoi le back-office ne reflète pas vos changements

Votre UPDATE SQL sur id_category_default ne s'affiche pas dans PrestaShop ? Découvrez pourquoi il faut modifier deux tables et comment le faire correctement.

En bref : Quand vous modifiez id_category_default en SQL, le back-office PrestaShop ne reflète pas le changement car il lit ps_product_shop, pas ps_product. Il faut impérativement mettre à jour les deux tables — c'est une conséquence de l'architecture multiboutique intégrée au cœur de PrestaShop depuis la version 1.5.

Publié le 21 mars 2026 5 min de lecture Alexandre Carette

Le problème : une modification SQL invisible dans le back-office

Vous avez exécuté une requête SQL pour modifier en masse la catégorie par défaut (id_category_default) de vos produits, mais le back-office PrestaShop continue d'afficher l'ancienne valeur. La requête s'est pourtant exécutée sans erreur, et une vérification directe en base confirme que la table ps_product a bien été mise à jour.

Ce comportement déroute de nombreux développeurs, mais il s'explique par un choix architectural fondamental de PrestaShop.

La cause : l'architecture multiboutique et la double table produit

Depuis PrestaShop 1.5, le système est nativement multiboutique. Cette fonctionnalité fait partie du cœur même du CMS — elle n'est pas optionnelle et ne peut pas être désactivée au niveau de la structure de la base de données.

Concrètement, cela signifie que les informations produit sont réparties dans deux tables distinctes :

TableRôleContient `id_category_default` `ps_product`Données globales du produit✅ Oui `ps_product_shop`Données spécifiques à chaque boutique✅ Oui

Même si vous n'utilisez qu'une seule boutique, la table ps_product_shop existe et contient une ligne par produit liée à votre boutique (généralement id_shop = 1). C'est cette table que le back-office consulte en priorité pour afficher les informations produit.

Pourquoi cette architecture ?

Le principe est simple : un même produit peut appartenir à des catégories par défaut différentes selon la boutique. La table ps_product stocke une valeur "globale" tandis que ps_product_shop stocke la valeur effective pour chaque contexte boutique. En mode mono-boutique, le back-office lit systématiquement depuis ps_product_shop, ce qui rend toute modification limitée à ps_product invisible dans l'interface.

La solution : modifier les deux tables simultanément

Requête SQL correcte


-- Étape 1 : Mettre à jour la table globale
UPDATE ps_product
SET id_category_default = 42
WHERE id_product IN (101, 102, 103, 104);

-- Étape 2 : Mettre à jour la table boutique (INDISPENSABLE)
UPDATE ps_product_shop
SET id_category_default = 42
WHERE id_product IN (101, 102, 103, 104)
AND id_shop = 1;

Important : Remplacez ps_ par le préfixe réel de vos tables si vous l'avez personnalisé à l'installation (par exemple tr_product et tr_product_shop).

Mise à jour massive conditionnelle

Pour un cas d'usage plus réaliste où vous souhaitez déplacer tous les produits d'une catégorie vers une autre :


-- Déplacer tous les produits de la catégorie 10 vers la catégorie 42
UPDATE ps_product
SET id_category_default = 42
WHERE id_category_default = 10;

UPDATE ps_product_shop
SET id_category_default = 42
WHERE id_category_default = 10
AND id_shop = 1;

En environnement multiboutique

Si vous exploitez plusieurs boutiques et souhaitez cibler une boutique spécifique :


-- Modifier uniquement pour la boutique 2
UPDATE ps_product_shop
SET id_category_default = 42
WHERE id_product IN (101, 102, 103)
AND id_shop = 2;

Dans ce cas, la table ps_product peut conserver l'ancienne valeur si les autres boutiques ne sont pas concernées.

N'oubliez pas la table d'association catégorie-produit

Modifier id_category_default ne suffit pas si le produit n'est pas encore associé à la nouvelle catégorie. Vérifiez et complétez la table ps_category_product :


-- Vérifier si l'association existe
SELECT * FROM ps_category_product
WHERE id_product = 101 AND id_category = 42;

-- Si elle n'existe pas, la créer
INSERT IGNORE INTO ps_category_product (id_category, id_product, position)
SELECT 42, id_product, 0
FROM ps_product
WHERE id_product IN (101, 102, 103, 104);

Sans cette association, le produit risque de ne pas apparaître dans la navigation par catégorie côté front-office, même si la catégorie par défaut est correctement définie.

Vider le cache après modification

Après toute modification directe en base de données, pensez à vider le cache PrestaShop :


# PrestaShop 1.6 / 1.7
rm -rf var/cache/prod/* var/cache/dev/*

# PrestaShop 8.x
php bin/console cache:clear --env=prod

Ou via le back-office : Paramètres avancés → Performances → Vider le cache.

Approche recommandée en PrestaShop 8.x : l'API ou les classes ObjectModel

Pour les mises à jour en masse sur PrestaShop 8.x, il est préférable d'utiliser l'ObjectModel ou un script PHP dédié plutôt que du SQL brut. Cette approche garantit la cohérence des données entre toutes les tables :


// Script de mise à jour via ObjectModel
$productIds = [101, 102, 103, 104];
$newCategoryId = 42;

foreach ($productIds as $idProduct) {
    $product = new Product($idProduct);
    $product->id_category_default = $newCategoryId;
    
    // Ajouter l'association si nécessaire
    if (!in_array($newCategoryId, $product->getCategories())) {
        $product->addToCategories([$newCategoryId]);
    }
    
    $product->update();
}

Cette méthode met automatiquement à jour ps_product, ps_product_shop, ps_category_product et vide les caches pertinents. Elle est plus lente que le SQL direct mais élimine tout risque d'incohérence.

Checklist de mise à jour en masse

  1. ✅ Sauvegardez votre base de données avant toute opération
  2. ✅ Mettez à jour `ps_product.id_category_default`
  3. ✅ Mettez à jour `ps_product_shop.id_category_default` (pour chaque `id_shop` concerné)
  4. ✅ Vérifiez les associations dans `ps_category_product`
  5. ✅ Videz le cache PrestaShop
  6. ✅ Vérifiez le résultat dans le back-office ET le front-office
  7. ✅ Contrôlez que les URLs de produits sont toujours fonctionnelles si les URL simplifiées incluent la catégorie
#id_category_default #SQL #multiboutique #ps_product_shop #catégorie par défaut #mise à jour en masse

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.