# Importer un catalogue fournisseur volumineux dans WooCommerce sans planter

> Charger des centaines de milliers de références fournisseur sans timeout ni doublon demande un import en tâches de fond, pas un simple fichier CSV.

- Auteur : WordPress Développement
- Publié le : 2020-12-23
- Mis à jour le : 2020-12-23
- Catégorie : E-commerce
- URL : https://www.wpmoderne.fr/ecommerce/importer-catalogue-volumineux-woocommerce-sans-timeout/

## L’essentiel

- Découper l'import en lots plutôt qu'un fichier unique
- S'appuyer sur Action Scheduler pour la reprise sur erreur
- Dédupliquer sur la référence fournisseur, pas sur le nom

Combien de temps un import CSV WooCommerce standard tient-il face à un fichier de 200 000 lignes ? En général, moins de deux minutes avant que le serveur ne coupe l'exécution PHP, quel que soit le réglage de `max_execution_time` dans `php.ini` — parce que l'importeur natif charge tout en mémoire avant de commencer à écrire.

L'import natif de WooCommerce, accessible depuis *Produits > Tout importer*, convient parfaitement à un catalogue de quelques milliers de références. Au-delà, sur un catalogue fournisseur de plusieurs centaines de milliers de lignes, il faut changer d'approche et traiter l'import comme une file de tâches asynchrones plutôt qu'un script unique.

## Découper le fichier en lots gérables

La première étape consiste à scinder le fichier source en lots de taille raisonnable — 500 références par lot est un compromis qui tient sur la plupart des hébergements mutualisés sans dépasser les limites de mémoire allouées à PHP. Chaque lot devient une tâche indépendante, ce qui permet de reprendre l'import exactement là où il s'est arrêté en cas d'incident, sans repartir de zéro.

```
function decouper_fichier_csv_en_lots(string $chemin, int $taille_lot = 500): array
{
    $lots = [];
    $lot_courant = [];
    $handle = fopen($chemin, 'r');
    $entetes = fgetcsv($handle);

    while (($ligne = fgetcsv($handle)) !== false) {
        $lot_courant[] = array_combine($entetes, $ligne);
        if (count($lot_courant) >= $taille_lot) {
            $lots[] = $lot_courant;
            $lot_courant = [];
        }
    }
    if ($lot_courant) {
        $lots[] = $lot_courant;
    }
    fclose($handle);
    return $lots;
}
```

## Planifier chaque lot avec Action Scheduler

Action Scheduler, la bibliothèque de tâches planifiées embarquée par WooCommerce depuis plusieurs versions, permet de programmer chaque lot en arrière-plan sans bloquer une requête HTTP :

```
foreach ($lots as $index => $lot) {
    as_schedule_single_action(
        time() + ($index * 10),
        'importer_lot_produits_fournisseur',
        ['lot' => $lot, 'numero_lot' => $index],
        'import-catalogue-fournisseur'
    );
}

add_action('importer_lot_produits_fournisseur', function ($lot, $numero_lot) {
    foreach ($lot as $ligne) {
        importer_une_reference($ligne);
    }
}, 10, 2);
```

L'espacement de dix secondes entre chaque lot évite de saturer la base de données si l'hébergement limite le nombre de requêtes simultanées, un cas fréquent sur les offres mutualisées d'entrée de gamme.

> L'essentiel à retenir : Découper l'import en lots plutôt qu'un fichier unique ; S'appuyer sur Action Scheduler pour la reprise sur erreur ; Dédupliquer sur la référence fournisseur, pas sur le nom

## Dédupliquer sur la bonne clé

Le piège le plus fréquent d'un import répété (le fournisseur renvoie un fichier complet chaque semaine, pas seulement les nouveautés) est la déduplication sur le nom du produit plutôt que sur sa référence unique. Deux produits peuvent porter un intitulé identique tout en étant des références distinctes ; l'inverse est également vrai après une légère reformulation du nom par le fournisseur d'une livraison à l'autre.

- Stocker la référence fournisseur dans une métadonnée dédiée, par exemple `_reference_fournisseur`, jamais dans le SKU seul si celui-ci est recalculé en interne
- Rechercher un produit existant via `WC_Product_Data_Store_CPT::get_product_id_by_sku()` ou une requête directe sur la métadonnée avant toute création
- Mettre à jour le produit existant plutôt que d'en créer un doublon si la référence correspond déjà à un produit en base

## Suivre la progression sans tout recalculer

Une métadonnée d'option WordPress simple, incrémentée à chaque lot terminé, suffit à afficher une progression fiable dans l'administration sans avoir à recompter le nombre de produits en base à chaque rafraîchissement — ce qui, sur un catalogue de cette taille, deviendrait lui-même une requête coûteuse.

## En résumé

Un import de catalogue volumineux réussi ne repose pas sur un serveur plus puissant, mais sur un découpage en lots exploitant Action Scheduler et une déduplication basée sur la référence fournisseur. Cette approche tient aussi bien sur un hébergement mutualisé modeste que sur une infrastructure dédiée, avec une reprise sur erreur native en cas d'interruption.
