# Générer des factures PDF pour les commandes WooCommerce sans extension premium

> Une agence doit livrer des factures conformes à un client sans faire dépendre sa boutique d'un abonnement premium. Voici une génération PDF à la volée, entièrement maison.

- Auteur : Clément Hadrot
- Publié le : 2020-02-25
- Mis à jour le : 2020-02-25
- Catégorie : E-commerce
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ecommerce/generer-factures-pdf-commandes-woocommerce-sans-extension-premium/

## L’essentiel

- Aucune bibliothèque tierce coûteuse n'est requise
- Le PDF se génère depuis les données réelles de la commande
- Le fichier reste protégé derrière une vérification de droits

Une agence de développement livre régulièrement des boutiques à des artisans et petits commerces qui n'ont ni service comptable ni budget pour une extension de facturation premium. Le besoin reste simple : un PDF présentable, avec numéro, mentions légales et détail des lignes de commande, téléchargeable depuis l'espace client et l'administration.

Plutôt que d'imposer un abonnement mensuel pour ce besoin ponctuel, il est tout à fait possible de générer ce PDF à la volée avec une bibliothèque libre embarquée dans le plugin maison de l'agence. Ce billet couvre uniquement la génération du document ; la question de la conformité comptable ou de la déclaration de TVA relève d'un autre sujet, à traiter avec l'expert-comptable du client.

## Le problème posé

Concrètement, il faut répondre à trois contraintes : générer un PDF depuis les données d'une commande WooCommerce existante, le rendre accessible uniquement au client concerné et à l'administrateur, et éviter d'alourdir la boutique avec une dépendance lourde comme un moteur de rendu HTML complet.

## La bibliothèque retenue

> L'essentiel à retenir : Aucune bibliothèque tierce coûteuse n'est requise ; Le PDF se génère depuis les données réelles de la commande ; Le fichier reste protégé derrière une vérification de droits

Pour ce cas, `dompdf/dompdf` installée via Composer fait très bien l'affaire : elle transforme un gabarit HTML/CSS simple en PDF, sans dépendance système exotique. L'agence l'embarque directement dans le dossier `vendor` de son plugin maison, avec un autoloader dédié pour ne pas entrer en conflit avec d'autres plugins.

```
composer require dompdf/dompdf
```

## Le snippet : générer le PDF à la demande

La génération se déclenche depuis un bouton ajouté à la page « Mes commandes » du compte client et depuis l'écran d'édition de commande en back-office. Le point d'entrée commun est une fonction qui construit le HTML puis le convertit :

```
function agence_generer_facture_pdf( $order_id ) {
    $order = wc_get_order( $order_id );

    if ( ! $order ) {
        wp_die( 'Commande introuvable.' );
    }

    ob_start();
    include AGENCE_FACTURES_PATH . '/templates/facture.php';
    $html = ob_get_clean();

    $dompdf = new Dompdf\Dompdf();
    $dompdf->loadHtml( $html, 'UTF-8' );
    $dompdf->setPaper( 'A4', 'portrait' );
    $dompdf->render();

    $dompdf->stream(
        'facture-' . $order->get_order_number() . '.pdf',
        array( 'Attachment' => true )
    );
    exit;
}
```

Le gabarit `facture.php` reste un simple fichier HTML avec un peu de PHP inline, alimenté directement par l'objet `$order` :

```
<h1>Facture <?php echo esc_html( $order->get_order_number() ); ?></h1>
<p>Date : <?php echo esc_html( wc_format_datetime( $order->get_date_created() ) ); ?></p>

<table>
    <thead>
        <tr><th>Article</th><th>Qté</th><th>Total</th></tr>
    </thead>
    <tbody>
    <?php foreach ( $order->get_items() as $item ) : ?>
        <tr>
            <td><?php echo esc_html( $item->get_name() ); ?></td>
            <td><?php echo esc_html( $item->get_quantity() ); ?></td>
            <td><?php echo wc_price( $item->get_total() ); ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
<p>Total TTC : <?php echo wc_price( $order->get_total() ); ?></p>
```

## Sécuriser l'accès au fichier

Le point sensible n'est pas la génération, mais l'accès : il faut vérifier que l'utilisateur qui demande la facture est bien le propriétaire de la commande, ou un administrateur. Le contrôle se fait avant tout appel à Dompdf :

```
function agence_verifier_acces_facture( $order_id ) {
    $order = wc_get_order( $order_id );

    if ( ! $order ) {
        return false;
    }

    $user_id = get_current_user_id();

    return current_user_can( 'manage_woocommerce' )
        || (int) $order->get_customer_id() === $user_id;
}
```

Ce contrôle bloque toute tentative d'accès à une facture en devinant simplement l'identifiant de commande dans l'URL, une faille étonnamment fréquente sur les implémentations artisanales de ce type de fonctionnalité.

## Ajouter le bouton dans l'administration

Un dernier détail rend la fonctionnalité vraiment utilisable au quotidien : un bouton d'action directement dans la liste des actions de commande, via le filtre `woocommerce_order_actions` :

```
add_filter( 'woocommerce_order_actions', function( $actions ) {
    $actions['generer_facture_pdf'] = 'Télécharger la facture PDF';
    return $actions;
} );
```

- Un lien identique s'ajoute sur la page « Mes commandes » côté client via le hook `woocommerce_my_account_my_orders_actions`.
- Le PDF peut être joint automatiquement à l'e-mail de confirmation de commande pour les clients qui le demandent.
- Rien n'empêche, plus tard, de stocker le PDF généré sur le disque pour éviter de le régénérer à chaque téléchargement.

> Sur les projets de l'agence, ce petit module maison couvre neuf demandes sur dix : le dixième cas, souvent une facture d'acompte ou un avoir complexe, justifie alors une vraie extension de facturation.

## Variantes possibles

Selon le client, le gabarit peut inclure un logo, les mentions légales complètes de l'entreprise (SIRET, mentions de TVA, conditions de règlement) ou encore une numérotation séquentielle stockée en meta de commande plutôt que de réutiliser le numéro de commande WooCommerce. Une autre variante utile consiste à générer le PDF automatiquement au passage de la commande au statut `completed`, via le hook `woocommerce_order_status_completed`, et à le stocker dans un dossier protégé des uploads.

## Pour aller plus loin

Cette approche couvre un besoin de facturation basique, lisible et fonctionnel, sans coût de licence récurrent. Elle ne remplace pas un logiciel de comptabilité et ne gère ni la numérotation légale imposée dans certains pays, ni l'archivage réglementaire : ces aspects doivent être validés avec le comptable du client avant toute mise en production commerciale sérieuse.
