Publié le

Importer la liste des clients d'un site WooCommerce vers un site Shopify

Lors de la migration d'un site WooCommerce vers Shopify, il peut être utile d'importer la liste des clients de l'ancien site pour communiquer avec eux ou pour qu'ils retrouvent leurs informations personnelles comme leur adresse, leur numéro de téléphone, leur mail utilisé pour les communications, etc.

S'il est possible d'effectuer un export client côté WooCommerce avec certains plugins à installer sur sa boutique, je les trouve généralement lents et obscurs sur les transformations qu'ils effectuent pour sérialiser les données clients de la base de données vers un fichier CSV.

Exporter les clients depuis un dump de la base de données

La solution que je privilégie généralement est de réaliser cet export directement depuis un dump récent de la base de données du site WordPress. Ainsi, on télécharge l'ensemble des données en une seule fois, on n'utilise pas inutilement le thread PHP du serveur et on peut experimenter autant qu'on veut avec différents exports en local.

Voilà la marche à suivre :

  1. Récupérer un export .sql de la base de données du site via la commande sqldump ou directement depuis l'interface d'administration de son hébergeur
  2. Importer la base de données dans un environnement local
  3. Utiliser une commande SQL pour exporter les données nécessaires

Importer les données dans Shopify avec Node.js

Pour ce genre de scripts, j'utilise généralement Node.js par habitude et pour sa simplicité de mise en œuvre. Nous pourrions l'écrire en bash directement, en Python ou tout autre language adapté.

Voilà le script que j'utilise pour exporter les données depuis la base WordPress importée en local, transformer ces données puis générer un fichier CSV prêt à être importé via l'interface d'administration de Shopify.

const mysql = require('mysql2/promise');
const fs = require('fs');
const csv = require('fast-csv');

// TODO: Update these settings with your own config
const dbConfig = {
  host: 'localhost',
  user: 'database_user',
  password: 'database_password',
  database: 'database_name',
};

// TODO: Update these settings with your own config
const prefix = 'wp_';
const csvFilePath = 'shopify_customers.csv';

// Query to fetch WooCommerce customers
const query = `
  SELECT
    u.user_email AS email,
    um1.meta_value AS first_name,
    um2.meta_value AS last_name,
    um3.meta_value AS address1,
    um4.meta_value AS address2,
    um5.meta_value AS city,
    um6.meta_value AS province,
    um7.meta_value AS country,
    um8.meta_value AS zip,
    um9.meta_value AS phone
  FROM ${prefix}users u
  LEFT JOIN ${prefix}usermeta um1 ON u.ID = um1.user_id AND um1.meta_key = 'billing_first_name'
  LEFT JOIN ${prefix}usermeta um2 ON u.ID = um2.user_id AND um2.meta_key = 'billing_last_name'
  LEFT JOIN ${prefix}usermeta um3 ON u.ID = um3.user_id AND um3.meta_key = 'billing_address_1'
  LEFT JOIN ${prefix}usermeta um4 ON u.ID = um4.user_id AND um4.meta_key = 'billing_address_2'
  LEFT JOIN ${prefix}usermeta um5 ON u.ID = um5.user_id AND um5.meta_key = 'billing_city'
  LEFT JOIN ${prefix}usermeta um6 ON u.ID = um6.user_id AND um6.meta_key = 'billing_state'
  LEFT JOIN ${prefix}usermeta um7 ON u.ID = um7.user_id AND um7.meta_key = 'billing_country'
  LEFT JOIN ${prefix}usermeta um8 ON u.ID = um8.user_id AND um8.meta_key = 'billing_postcode'
  LEFT JOIN ${prefix}usermeta um9 ON u.ID = um9.user_id AND um9.meta_key = 'billing_phone'
  WHERE u.ID IN (
    SELECT user_id
    FROM ${prefix}usermeta
    WHERE meta_key = '${prefix}capabilities'
      AND meta_value LIKE '%customer%'
  );
`;

async function exportCustomersToCSV() {
  try {
    const connection = await mysql.createConnection(dbConfig);
    const [rows] = await connection.execute(query);
    await connection.end();

    const headers = [
      'First Name',
      'Last Name',
      'Email',
      'Accepts Email Marketing',
      'Default Address Company',
      'Default Address Address1',
      'Default Address Address2',
      'Default Address City',
      'Default Address Province Code',
      'Default Address Country Code',
      'Default Address Zip',
      'Default Address Phone',
      'Phone',
      'Accepts SMS Marketing',
      'Tags',
      'Note',
      'Tax Exempt',
    ];

    // Map the data to match Shopify's expected format
    const formattedRows = rows.map((row) => ({
      'First Name': row.first_name,
      'Last Name': row.last_name,
      Email: row.email,
      'Accepts Email Marketing': 'no', // Default to 'no', customize if necessary
      'Default Address Company': '', // Assuming no company data, can be modified if needed
      'Default Address Address1': row.address1,
      'Default Address Address2': row.address2,
      'Default Address City': row.city,
      'Default Address Province Code': row.province, // Assuming the state code is already in the correct format
      'Default Address Country Code': row.country, // Assuming the country code is already in the correct format
      'Default Address Zip': row.zip,
      'Default Address Phone': row.phone,
      Phone: row.phone,
      'Accepts SMS Marketing': 'no', // Default to 'no', customize if necessary
      Tags: '', // Customize if necessary
      Note: '', // Customize if necessary
      'Tax Exempt': 'no', // Default to 'no', customize if necessary
    }));

    // Create a writable stream for the CSV file
    const ws = fs.createWriteStream(csvFilePath);

    // Write the CSV file
    csv.write(formattedRows, { headers }).pipe(ws);

    console.log(`Customers have been exported to ${csvFilePath}`);
  } catch (error) {
    console.error('Error exporting customers:', error);
  }
}

// Run the function
exportCustomersToCSV();

Une fois lancé, celui-ci génère un fichier shopify_customer.csv qui contient tous les utilisateurs du site avec pour chacun leurs informations personnelles exportées depuis le site WooCommerce. Il ne vous reste plus qu'à le déposer sur le nouveau site via l'interface prévue à cette effet.

Dès lors, vos clients pourront se connecter à votre nouveau site et retrouver automatiquement leurs informations personnelles.