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.

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.