Woocommerce – Plugin Export commande avec email et téléphone

Export commande avec email et téléphone

Export commande avec email et téléphone

Le plugin « Export commande avec email et téléphone » a été conçu :

  • Exporter uniquement les commandes payées ou validées

  • Filtrer les résultats par produit(s) sélectionné(s)

  • Inclure les données clients essentielles (email, téléphone, nom)

  • Générer un fichier CSV compatible Excel

  • Éviter l’export des remboursements (refunds)

Aucune automatisation, aucune planification, aucun traitement en arrière-plan : le fonctionnement est volontairement manuel et contrôlé, afin de garantir la lisibilité et la fiabilité des données exportées.

Intégration dans l’interface WooCommerce

Une fois activé, le plugin « Export commande avec email et téléphone » ajoute une entrée de menu dans l’administration :

| Admin → WooCommerce → Export commandes payées

Ce choix d’emplacement n’est pas arbitraire. Il respecte la hiérarchie recommandée par WordPress pour les extensions dépendantes de WooCommerce, en utilisant add_submenu_page() sous le menu principal WooCommerce
(Source : WordPress Plugin Handbook – Admin Menus).

L’accès à cette page est restreint à la capacité manage_woocommerce, qui correspond au niveau d’autorisation standard pour la gestion des commandes WooCommerce.

(Source : WooCommerce Capabilities).

/**
 * --------------------------------------------------------
 * MENU ADMIN
 * --------------------------------------------------------
 */
add_action( 'admin_menu', function () {
    add_submenu_page(
        'woocommerce',
        'Export commandes payées par produits',
        'Export commandes payées',
        'manage_woocommerce',
        'wc-export-paid-orders-products',
        'eloou_export_orders_page'
    );
});

Sélection des produits

Sur la page d’export, l’utilisateur dispose d’un champ de sélection multiple listant les produits publiés du catalogue.

Caractéristiques importantes :

  • Les produits sont récupérés via wc_get_products(), l’API officielle WooCommerce
  • Seuls les produits publiés sont listés
  • La sélection multiple permet d’exporter plusieurs produits en une seule opération

Ce mécanisme garantit que l’export est toujours basé sur des produits existants et valides, sans saisie manuelle d’identifiants.

(Source : https://woocommerce.github.io/code-reference/functions/wc_get_products.html).

/**
 * --------------------------------------------------------
 * PAGE HTML (FORMULAIRE)
 * --------------------------------------------------------
 */
function eloou_export_orders_page() {
    ?>
    <div class="wrap">
        <h1>Export des commandes payées par produits</h1>

        <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
            <?php wp_nonce_field( 'eloou_export_orders' ); ?>
            <input type="hidden" name="action" value="eloou_export_orders">

            <table class="form-table">
                <tr>
                    <th>Produits</th>
                    <td>
                        <select name="product_ids[]" multiple required style="min-width:350px; min-height:160px;">
                            <?php
                            $products = wc_get_products( [
                                'limit'  => 200,
                                'status' => 'publish',
                            ] );
                            foreach ( $products as $product ) {
                                echo '<option value="' . esc_attr( $product->get_id() ) . '">' .
                                     esc_html( $product->get_name() ) .
                                     '</option>';
                            }
                            ?>
                        </select>
                        <p class="description">
                            Maintenir <strong>Ctrl</strong> (Windows) ou <strong>Cmd</strong> (Mac) pour sélectionner plusieurs produits.
                        </p>
                    </td>
                </tr>
            </table>

            <?php submit_button( 'Exporter en CSV' ); ?>
        </form>
    </div>
    <?php
}

Sécurité du formulaire

Le formulaire d’export repose sur deux mécanismes de sécurité standards WordPress : 1. Vérification des permissions utilisateur L’export est bloqué si l’utilisateur n’a pas la capacité manage_woocommerce. 2. Protection par nonce Le formulaire utilise wp_nonce_field() et check_admin_referer() pour prévenir les attaques CSRF. Ces pratiques sont explicitement recommandées par WordPress pour toute action sensible côté administration. Aucune donnée n’est traitée tant que ces contrôles ne sont pas validés.

(Source : https://developer.wordpress.org/apis/security/nonces/).

Génération du fichier CSV

Une fois le formulaire soumis, le plugin déclenche un handler via admin-post.php, mécanisme officiel pour les traitements POST côté administration.

Le fichier CSV est généré en flux direct vers le navigateur :

  • Aucun fichier temporaire n’est créé sur le serveur
  • Les en-têtes HTTP forcent le téléchargement
  • Le contenu est encodé en UTF-8 avec BOM, afin d’assurer une ouverture correcte dans Microsoft Excel

Ce point est important : sans BOM UTF-8, Excel peut mal interpréter les caractères accentués, même si le fichier est techniquement valide

(Source : Microsoft Excel CSV encoding behavior)

/**
 * --------------------------------------------------------
 * HANDLER CSV
 * --------------------------------------------------------
 */
add_action( 'admin_post_eloou_export_orders', 'eloou_generate_csv' );

function eloou_generate_csv() {

    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        wp_die( 'Accès refusé' );
    }

    check_admin_referer( 'eloou_export_orders' );

    if ( empty( $_POST['product_ids'] ) || ! is_array( $_POST['product_ids'] ) ) {
        wp_die( 'Aucun produit sélectionné' );
    }

    $product_ids = array_map( 'intval', $_POST['product_ids'] );

    // Nettoyage strict du buffer
    while ( ob_get_level() ) {
        ob_end_clean();
    }

    header( 'Content-Type: text/csv; charset=UTF-8' );
    header( 'Content-Disposition: attachment; filename=export-commandes-produits-payees.csv' );
    header( 'Pragma: no-cache' );
    header( 'Expires: 0' );

    $output = fopen( 'php://output', 'w' );

    // BOM UTF-8 pour compatibilité Excel
    fprintf( $output, chr(0xEF).chr(0xBB).chr(0xBF) );

    fputcsv( $output, [
        'Commande ID',
        'Date',
        'Produit',
        'Produit ID',
        'Quantité',
        'Email',
        'Téléphone',
        'Nom',
        'Prénom',
        'Total commande'
    ] );

    // On récupère uniquement les commandes payées / validées
    $paid_statuses = [ 'wc-processing', 'wc-completed' ]; // processing et completed
    $orders = wc_get_orders( [
        'limit'  => -1,
        'status' => $paid_statuses,
    ] );

    foreach ( $orders as $order ) {

        // Ignore les objets autres que WC_Order
        if ( ! is_a( $order, 'WC_Order' ) ) {
            continue;
        }

        foreach ( $order->get_items( 'line_item' ) as $item ) {

            if ( ! in_array( (int) $item->get_product_id(), $product_ids, true ) ) {
                continue;
            }

            fputcsv( $output, [
                $order->get_id(),
                $order->get_date_created() ? $order->get_date_created()->date( 'Y-m-d H:i:s' ) : '',
                $item->get_name(),
                $item->get_product_id(),
                $item->get_quantity(),
                $order->get_billing_email(),
                $order->get_billing_phone(),
                $order->get_billing_last_name(),
                $order->get_billing_first_name(),
                $order->get_total(),
            ] );
        }
    }

    fclose( $output );
    exit;
}

Filtrage des commandes

Le plugin récupère les commandes WooCommerce via wc_get_orders() avec les statuts :

  • processing
  • completed

Ces deux statuts correspondent aux commandes payées ou finalisées dans WooCommerce par défaut
(Source : WooCommerce Order Statuses).

Les commandes avec remboursement ne sont pas prises en compte, car le plugin ne traite que les lignes de commande (line_item) et ignore les objets de type refund.

(Source : https://woocommerce.github.io/code-reference/functions/wc_get_orders.html).

Données exportées

Chaque ligne du CSV correspond à un produit présent dans une commande, et non à une commande globale.

Les colonnes exportées sont :

  • ID de la commande
  • Date de création
  • Nom du produit
  • ID du produit
  • Quantité commandée
  • Email de facturation
  • Téléphone de facturation
  • Nom
  • Prénom
  • Total de la commande

Ce choix permet une exploitation fine par produit, notamment pour des analyses commerciales ou logistiques.

Conclusion

Ce plugin « Export commande avec email et téléphone » propose une solution :

  • simple
  • lisible
  • conforme aux API officielles
  • orientée usage réel

Il s’adresse avant tout aux administrateurs WooCommerce qui souhaitent exporter rapidement des commandes payées par produit, sans dépendre d’extensions complexes ou de services externes.

Son code est volontairement direct, ce qui facilite l’audit, la maintenance et l’adaptation à des besoins spécifiques.

Attention, je ne peux pas confirmer son adéquation pour des boutiques à très fort volume sans tests spécifiques sur l’environnement concerné.

Ce code est un exemple
et non un code optimisé et sécurisé à 100%.
C'est une base de travail fonctionnelle.

<?php
/**
 * Plugin Name: WooCommerce – Export commandes payées par produits (CSV stable)
 * Description: Export CSV des commandes WooCommerce payées/validées avec email et téléphone, filtrées par un ou plusieurs produits. Ignore les refunds.
 * Author: E-loou
 * Version: 1.4.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * --------------------------------------------------------
 * MENU ADMIN
 * --------------------------------------------------------
 */
add_action( 'admin_menu', function () {
    add_submenu_page(
        'woocommerce',
        'Export commandes payées par produits',
        'Export commandes payées',
        'manage_woocommerce',
        'wc-export-paid-orders-products',
        'eloou_export_orders_page'
    );
});

/**
 * --------------------------------------------------------
 * PAGE HTML (FORMULAIRE)
 * --------------------------------------------------------
 */
function eloou_export_orders_page() {
    ?>
    <div class="wrap">
        <h1>Export des commandes payées par produits</h1>

        <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
            <?php wp_nonce_field( 'eloou_export_orders' ); ?>
            <input type="hidden" name="action" value="eloou_export_orders">

            <table class="form-table">
                <tr>
                    <th>Produits</th>
                    <td>
                        <select name="product_ids[]" multiple required style="min-width:350px; min-height:160px;">
                            <?php
                            $products = wc_get_products( [
                                'limit'  => 200,
                                'status' => 'publish',
                            ] );
                            foreach ( $products as $product ) {
                                echo '<option value="' . esc_attr( $product->get_id() ) . '">' .
                                     esc_html( $product->get_name() ) .
                                     '</option>';
                            }
                            ?>
                        </select>
                        <p class="description">
                            Maintenir <strong>Ctrl</strong> (Windows) ou <strong>Cmd</strong> (Mac) pour sélectionner plusieurs produits.
                        </p>
                    </td>
                </tr>
            </table>

            <?php submit_button( 'Exporter en CSV' ); ?>
        </form>
    </div>
    <?php
}

/**
 * --------------------------------------------------------
 * HANDLER CSV
 * --------------------------------------------------------
 */
add_action( 'admin_post_eloou_export_orders', 'eloou_generate_csv' );

function eloou_generate_csv() {

    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        wp_die( 'Accès refusé' );
    }

    check_admin_referer( 'eloou_export_orders' );

    if ( empty( $_POST['product_ids'] ) || ! is_array( $_POST['product_ids'] ) ) {
        wp_die( 'Aucun produit sélectionné' );
    }

    $product_ids = array_map( 'intval', $_POST['product_ids'] );

    // Nettoyage strict du buffer
    while ( ob_get_level() ) {
        ob_end_clean();
    }

    header( 'Content-Type: text/csv; charset=UTF-8' );
    header( 'Content-Disposition: attachment; filename=export-commandes-produits-payees.csv' );
    header( 'Pragma: no-cache' );
    header( 'Expires: 0' );

    $output = fopen( 'php://output', 'w' );

    // BOM UTF-8 pour compatibilité Excel
    fprintf( $output, chr(0xEF).chr(0xBB).chr(0xBF) );

    fputcsv( $output, [
        'Commande ID',
        'Date',
        'Produit',
        'Produit ID',
        'Quantité',
        'Email',
        'Téléphone',
        'Nom',
        'Prénom',
        'Total commande'
    ] );

    // On récupère uniquement les commandes payées / validées
    $paid_statuses = [ 'wc-processing', 'wc-completed' ]; // processing et completed
    $orders = wc_get_orders( [
        'limit'  => -1,
        'status' => $paid_statuses,
    ] );

    foreach ( $orders as $order ) {

        // Ignore les objets autres que WC_Order
        if ( ! is_a( $order, 'WC_Order' ) ) {
            continue;
        }

        foreach ( $order->get_items( 'line_item' ) as $item ) {

            if ( ! in_array( (int) $item->get_product_id(), $product_ids, true ) ) {
                continue;
            }

            fputcsv( $output, [
                $order->get_id(),
                $order->get_date_created() ? $order->get_date_created()->date( 'Y-m-d H:i:s' ) : '',
                $item->get_name(),
                $item->get_product_id(),
                $item->get_quantity(),
                $order->get_billing_email(),
                $order->get_billing_phone(),
                $order->get_billing_last_name(),
                $order->get_billing_first_name(),
                $order->get_total(),
            ] );
        }
    }

    fclose( $output );
    exit;
}

Un besoin ?