🌐 Lire cet article dans une autre langue : English · Español · Deutsch · Français · العربية · Bahasa Melayu · 简体中文 · 日本語
La plupart des petites agences et des indépendants facturent de l’une de deux façons. Soit avec un tableur et un modèle Word que quelqu’un exporte à la main en PDF, soit avec un service de facturation en ligne facturé par utilisateur et par mois, indéfiniment. La première méthode s’effondre dès que deux personnes s’en servent. La seconde fonctionne bien jusqu’à l’arrivée d’un nouveau collaborateur, d’une deuxième devise ou d’un client qui a besoin de quelque chose pour lequel le produit n’a jamais été conçu.
Nous avions les deux problèmes, alors nous avons créé notre propre plugin de facturation WordPress : ArtinTech Invoice Manager. Il fonctionne comme une application plein écran au sein d’un site WordPress. Il produit des factures professionnelles exportables en PDF en un clic, tient un carnet clients avec les soldes dus, suit les paiements dans plusieurs devises et propose un espace d’administration pour gérer les utilisateurs. Le plugin tourne sur ce site, et nous l’utilisons aujourd’hui pour facturer nos propres clients.
Cet article est le journal de développement complet. Il présente ce que fait le plugin, comment il est construit et pourquoi, comment fonctionne sa sécurité, quels bugs nous avons trouvés avant nos clients et ce qu’il a fallu faire pour préparer le code au répertoire de plugins WordPress.org. Si vous hésitez entre faire développer un outil de facturation sur mesure et utiliser une solution existante, les dernières sections sont écrites pour vous.

Pourquoi nous avons créé notre propre plugin de facturation WordPress
Développer un logiciel que l’on pourrait louer est généralement une erreur. Il vaut donc la peine d’expliquer pourquoi ce n’en était pas une ici. Les raisons décisives étaient pratiques, pas idéologiques.
- Les données doivent rester dans l’entreprise. Les factures, les adresses des clients et l’historique des paiements constituent le registre financier d’une entreprise. Les conserver dans la base de données WordPress que nous sauvegardons et contrôlons déjà est plus simple que de dépendre du bouton d’export d’un tiers le jour où nous en aurons besoin.
- La tarification par utilisateur joue contre vous. Un outil en ligne bon marché pour une personne devient un vrai poste de dépense dès qu’une petite équipe et quelques prestataires ont besoin de leur propre accès. Un plugin coûte la même chose qu’il soit utilisé par une personne ou par vingt.
- Plusieurs titulaires de compte indépendants, une seule installation. Chaque personne devait avoir ses propres factures, clients, logo, coordonnées bancaires et numérotation, totalement séparés des autres, sur un seul site.
- Nous facturons à l’international. Nous facturons des clients à l’étranger, dans plusieurs devises. Il nous fallait des totaux par devise, sans conversion silencieuse, et des factures comportant les coordonnées bancaires pour les virements internationaux.
- Nous voulions pouvoir le modifier nous-mêmes. Quand nous avons eu besoin d’un bouton « Marquer comme payée » ou d’un interrupteur pour masquer le logo du client, nous le voulions l’après-midi même, pas un jour sur la feuille de route d’un éditeur.
Rien de tout cela ne fait des logiciels de facturation en ligne un mauvais choix. C’est un compromis différent, et une comparaison directe aide à y voir clair.
| Service de facturation en ligne | Plugin de facturation WordPress auto-hébergé | |
|---|---|---|
| Emplacement des données | Serveurs de l’éditeur | Votre propre base de données WordPress |
| Coût quand l’équipe grandit | Augmente généralement par utilisateur | Fixe, quel que soit le nombre d’utilisateurs |
| Mise en place | Quelques minutes | Installer, activer, créer la page de l’application |
| Personnalisation | Ce que permettent les réglages | Tout ce que permet le code |
| Maintenance | Assurée par l’éditeur | Votre responsabilité, comme pour tout plugin |
| Intégrations | Souvent un large catalogue de connecteurs prêts à l’emploi | Développées selon votre propre écosystème |
Si la colonne de droite ressemble à une liste de corvées, un outil en ligne vous conviendra probablement mieux. Si elle ressemble à ce que vous faites déjà pour votre site, un plugin devient intéressant.
Comment ça marche : de l’installation à la facture payée
Avant d’entrer dans les détails, voici le déroulement complet, du début à la fin : ce qu’un administrateur fait une seule fois et ce qu’un titulaire de compte fait pour chaque facture. Neuf étapes, chacune montrée sur l’interface réelle.
Étape 1 : installer le plugin et créer la page de l’application
- Téléversez le plugin depuis Plugins → Add New → Upload Plugin et activez-le.
- Ouvrez le nouveau menu Invoice Manager dans wp-admin.
- Cliquez sur Create app page.
Une page est alors publiée à l’adresse /invoice-manager/, et cette page est l’application. Rien d’autre ne change sur le site. Les administrateurs peuvent l’utiliser immédiatement.
Étape 2 : se connecter ou laisser d’autres personnes s’inscrire
La page de l’application affiche son propre écran de connexion à toute personne non connectée. On se connecte avec l’identifiant ou l’adresse e-mail WordPress habituels, avec les options « Remember me » et « Forgot password ».

Si vous activez l’inscription publique, un lien Create one apparaît sous le formulaire de connexion et mène à l’inscription. Si la validation par un administrateur est activée, le nouveau compte reste « en attente » jusqu’à ce qu’un administrateur l’approuve.

Étape 3 : renseigner une fois les informations de l’entreprise
Chaque titulaire de compte commence par My settings :
- Téléverser son logo et choisir entre particulier et entreprise.
- Ajouter l’adresse, les coordonnées et le numéro fiscal.
- Définir la devise par défaut et le délai de paiement.
- Ajouter les coordonnées bancaires.
- Définir le préfixe et le numéro de départ des factures, et créer ses propres taux de taxe.
Tout ce qui est saisi ici est repris automatiquement dans les nouvelles factures : vous ne le tapez qu’une fois.

Étape 4 : ajouter des clients
Dans Clients → Add Client, enregistrez chaque client une seule fois : logo, nom de l’entreprise et du contact, e-mail, téléphone, adresse et numéro fiscal. Le carnet clients est consultable par recherche, et chaque fiche indique combien de factures a le client et ce qu’il reste à payer.

Étape 5 : créer une facture
Cliquez sur New invoice. Le numéro, la date, la devise, les conditions et vos informations sont déjà remplis.
- Choisissez le client.
- Ajoutez les lignes avec la quantité, le prix et le taux de taxe.
- Si besoin, appliquez une remise et ajoutez des champs personnalisés, comme un numéro de bon de commande.
- Choisissez si votre logo et celui du client apparaissent sur cette facture.
- Cliquez sur Save.
Les totaux se recalculent pendant la saisie.

Étape 6 : prévisualiser et télécharger le PDF
Preview montre la facture exactement telle que le client la recevra. Download PDF enregistre un fichier A4 que vous pouvez envoyer par e-mail, déposer sur un portail client ou imprimer.
Trois modèles sont disponibles, au choix pour chaque facture depuis le menu des modèles de l’éditeur :
- Blank : une mise en page épurée et minimaliste.
- Modern : un en-tête coloré.
- Classic : une typographie à empattements avec des filets de séparation.

Étape 7 : enregistrer le paiement
Quand l’argent arrive, cliquez sur Mark paid dans la ligne de la facture, ou sur l’icône $ pour enregistrer un paiement partiel avec la date, le moyen de paiement et la référence. Le statut change automatiquement :
- Partially paid (partiellement payée) après un paiement partiel.
- Paid (payée) lorsque le solde atteint zéro.
- Overdue (en retard) si l’échéance passe avant le paiement complet.

Étape 8 : suivre ce qui vous est dû
Les totaux du tableau de bord se mettent à jour instantanément. Pour un client donné, ouvrez sa page dans le carnet clients pour voir :
- Tout ce qui a été facturé, encaissé et reste dû, par devise.
- Toutes les factures que vous lui avez adressées.
C’est précisément l’écran à ouvrir avant un appel de relance.

Étape 9 : gérer les utilisateurs
Les administrateurs et les personnes ayant le rôle Invoice Manager Admin ouvrent Admin panel → Users. Ils peuvent y :
- Approuver les inscriptions en attente. L’utilisateur est prévenu automatiquement par e-mail.
- Suspendre ou réactiver des comptes.
- Créer des utilisateurs directement. Les nouveaux utilisateurs reçoivent un e-mail pour définir leur mot de passe.
- Modifier les rôles et supprimer des comptes.

Ce que fait le plugin : tour d’horizon des fonctionnalités
Le déroulement ci-dessus montre le chemin principal. Ce tour d’horizon couvre tout le reste. Tout fonctionne sur une seule page du site, avec une interface qui ressemble à une application autonome plutôt qu’à un écran WordPress.
Le tableau de bord de facturation
L’écran d’accueil répond à la question avec laquelle tout chef d’entreprise ouvre un outil de facturation : qui nous doit quoi ? En haut, quatre indicateurs : facturé, encaissé, restant dû et en retard. Chacun est calculé séparément pour chaque devise, avec un sélecteur lorsqu’un titulaire de compte facture dans plusieurs devises. En dessous figurent les quatre factures les plus récentes sous forme de cartes, puis la liste complète.
La liste peut être recherchée par numéro de facture ou nom de client, filtrée par client, statut, type de document et période, et triée par n’importe quelle colonne. Depuis chaque ligne, vous pouvez enregistrer un paiement, marquer la facture comme payée, télécharger le PDF, la dupliquer ou la supprimer sans l’ouvrir.
L’éditeur de facture
L’éditeur reprend la structure du document final : ce que vous saisissez se trouve à l’endroit où il apparaîtra. Les actions se trouvent dans la colonne de droite.
- Quatre types de documents : Invoice (facture), Quote (devis), Proforma et Credit Note (avoir).
- Numérotation automatique avec un préfixe par utilisateur, par exemple AT2623. Le numéro reste modifiable et les doublons sont refusés.
- Date de facture et date d’échéance. L’échéance est calculée à partir du délai de paiement par défaut de chaque personne.
- Lignes avec quantité, prix unitaire, description et un taux de taxe issu de la liste propre à l’utilisateur.
- Remise sur la facture, champs personnalisés comme un numéro de bon de commande, informations complémentaires sur l’entreprise et description libre.
- Informations client, choisies dans le carnet ou saisies pour un cas ponctuel, avec la possibilité d’enregistrer ce nouveau client sur-le-champ.
- Devise par facture et conditions de paiement préremplies depuis les réglages.
Les totaux se mettent à jour pendant la saisie. Si vous tentez de quitter la page avec des modifications non enregistrées, l’application vous le demande d’abord. C’est un petit détail qui compte davantage dans un outil de facturation que presque partout ailleurs.
Paiements, statuts et « Marquer comme payée »
Personne ne modifie à la main le statut d’une facture. Il découle des paiements enregistrés, et ne peut donc jamais contredire l’argent réellement reçu.
| Paiements enregistrés | Statut affiché |
|---|---|
| Aucun | Unpaid (impayée) |
| Moins que le total | Partially paid (partiellement payée) |
| Égal ou supérieur au total | Paid (payée) |
| Pas entièrement payée et échéance dépassée | Overdue (en retard) |
| Le type de document est Quote | Quote (jamais compté comme chiffre d’affaires) |
Chaque paiement comporte une date, un montant, un moyen de paiement et une note facultative : les paiements échelonnés et les écarts dus aux frais bancaires sont ainsi correctement enregistrés. Pour le cas le plus courant, quand le client a simplement payé, il existe un bouton Mark as paid. Il enregistre en un clic un paiement du solde restant à la date du jour.
Export PDF et modèles
Chaque facture peut être affichée dans l’un des trois modèles et téléchargée en PDF A4 : le modèle Blank, épuré ; le modèle Modern, avec un en-tête coloré ; et le modèle Classic, avec une typographie à empattements et des filets de séparation.
Le PDF comprend :
- Le logo de l’émetteur et celui du client. Chacun peut être masqué facture par facture.
- Les deux adresses.
- Les lignes, la remise, les taxes et le total.
- Les paiements reçus, le solde restant dû, les coordonnées bancaires et les conditions.
Le carnet clients
Les clients sont enregistrés une fois et réutilisés. Chacun dispose d’un logo, du nom de l’entreprise et du contact, d’une adresse, d’un numéro fiscal et de notes.
La liste des clients indique ce que chacun doit encore, et la page d’un client affiche :
- Les totaux facturé, encaissé et restant dû par devise.
- L’historique complet des factures.
- Un bouton qui démarre une nouvelle facture avec les informations du client déjà remplies.
Des réglages personnels pour chaque titulaire de compte
Chaque utilisateur dispose de ses propres :
- Logo et choix entre particulier et entreprise.
- Adresse et numéro de téléphone avec indicatif international.
- Numéro fiscal et site web.
- Devise par défaut et délai de paiement en jours.
- Coordonnées bancaires, préfixe de facture et prochain numéro.
- Texte par défaut des conditions de paiement et liste de taux de taxe nommés.
Deux personnes sur le même site peuvent ainsi émettre des factures qui semblent venir de deux entreprises différentes, parce que c’est le cas.
Inscription, validations et espace d’administration
L’application a ses propres écrans de connexion et d’inscription côté front-end : les titulaires de compte n’ont jamais besoin de voir wp-admin. L’inscription publique est facultative. Lorsqu’elle est activée, les nouveaux comptes peuvent nécessiter l’approbation d’un administrateur, qui reçoit un e-mail à chaque inscription.
Dans l’application, les administrateurs disposent d’un Admin panel en quatre sections :
- Overview : nombre de comptes et volume facturé pour l’ensemble des utilisateurs.
- Users : approuver, suspendre, réactiver, créer ou supprimer des comptes et modifier les rôles.
- Sign-up settings : réglages de l’inscription.
- Messages : messages du formulaire « Contact us » de l’application.

Architecture : comment un plugin de facturation WordPress doit stocker ses données
La qualité à long terme d’un plugin dépend en grande partie de son modèle de données. C’est la seule chose qu’on ne peut plus changer facilement une fois que de vraies factures existent. Nous avons pris quatre décisions très tôt, et toutes les quatre se sont révélées judicieuses.
Des types de contenu personnalisés plutôt que des tables dédiées
Les factures, les clients et les messages de contact sont des types de contenu personnalisés (custom post types) privés. Chaque enregistrement appartient à l’utilisateur WordPress qui l’a créé, et les données structurées sont stockées dans une seule entrée de post meta. Les réglages personnels sont dans le user meta, et les options générales du plugin utilisent l’Options API.
Des tables dédiées auraient été légèrement plus rapides avec de très gros volumes de données. En contrepartie, les types de contenu apportent beaucoup gratuitement :
- Les sauvegardes et migrations WordPress habituelles incluent automatiquement les données.
- Les outils d’export les comprennent déjà.
- Le cache d’objets fonctionne sans code supplémentaire.
- Lorsqu’un utilisateur est supprimé, ses enregistrements peuvent l’être avec lui sans une seule ligne de code de nettoyage.
Un outil de facturation pour une entreprise dépasse rarement quelques milliers de factures par personne. À cette échelle, l’approche native est la bonne.
Les types de contenu sont enregistrés comme entièrement privés : ni publics ni interrogeables, exclus de la recherche et masqués à la REST API et aux sitemaps. Une facture ne peut pas se retrouver par accident dans les résultats de recherche du thème ou dans le sitemap d’un plugin SEO.
Les instantanés : pourquoi une facture copie l’émetteur et le client
Une facture est une pièce à valeur légale, datée d’un moment précis. Si l’entreprise déménage l’an prochain, les factures de l’année précédente doivent toujours afficher l’ancienne adresse. C’est pourquoi, à la création d’une facture, le plugin y copie les informations de l’émetteur, ainsi que celles du client.
Modifier vos réglages ou l’adresse d’un client ne réécrit donc jamais le passé. Si vous voulez qu’un ancien brouillon reprenne les nouvelles informations, l’éditeur propose une action explicite, « Use my latest settings », au lieu de le faire en silence.
La facture conserve aussi un lien vers la fiche du client, sur lequel reposent les soldes par client. Si un client est supprimé, le lien est retiré mais l’instantané reste. La facture demeure lisible correctement et cesse simplement d’être comptée pour un client qui n’existe plus.
Le statut est calculé, jamais stocké
« En retard » dépend de la date du jour : un statut enregistré serait donc faux dès le lendemain. Le plugin stocke les faits : lignes, remise, paiements et date d’échéance. Il calcule le statut à chaque lecture de la facture. Un champ de statut enregistré est l’une des causes les plus fréquentes du « le tableau de bord dit payée, la banque dit non » dans les logiciels de gestion.
Des calculs que votre comptable validera
- La remise s’applique avant les taxes. Une remise de 10 % réduit à la fois le sous-total et la taxe calculée dessus, comme le prévoient la plupart des régimes fiscaux.
- Taxe par ligne. Chaque ligne porte son propre taux : une facture peut ainsi mélanger des prestations taxables et exonérées.
- Les avoirs sont comptés en négatif dans tous les totaux, et les devis ne sont pas comptés.
- Les devises ne sont jamais converties. Les totaux sont tenus par devise. Une conversion silencieuse à un taux quelconque donnerait des chiffres qui ne correspondent ni à la facture ni au relevé bancaire.
- Les totaux sont recalculés sur le serveur à partir des lignes lors de l’enregistrement. Le calcul dans le navigateur ne sert qu’à l’affichage. Une requête falsifiée ne peut pas enregistrer un total incohérent.
Une REST API qui vérifie la propriété à chaque requête
Le front-end communique avec WordPress via un espace de noms REST dédié. Chaque route passe par le même contrôle d’autorisation : la requête doit provenir d’un utilisateur connecté disposant de la capacité du plugin et d’un compte actif, et comporter un nonce WordPress valide.
En outre, chaque requête portant sur une facture ou un client vérifie que l’enregistrement appartient à l’utilisateur courant. Si ce n’est pas le cas, l’API répond not found plutôt que forbidden. C’est volontaire : « forbidden » confirme qu’un enregistrement portant cet ID existe, alors que « not found » ne révèle rien. Nous le testons explicitement en demandant la facture d’un compte tout en étant connectés avec un autre.
Chaque champ reçu est assaini et limité en longueur :
- Les dates doivent respecter un format strict.
- Les devises doivent comporter trois lettres.
- Les types de documents et les modèles doivent figurer dans une liste fixe.
- Les logos ne sont acceptés que sous forme d’images déjà présentes dans la médiathèque du site.
Les images téléversées sont décodées et vérifiées comme de véritables fichiers PNG, JPEG, GIF ou WebP avant d’entrer dans la médiathèque. Les SVG sont refusés, car un fichier SVG peut contenir des scripts.
Un détail pratique nous a épargné de futures demandes de support. Certains hébergements mutualisés et règles de pare-feu bloquent complètement les requêtes HTTP PUT et DELETE. L’application envoie donc chaque écriture en POST avec l’en-tête standard de substitution de méthode de WordPress, que la REST API prend en charge nativement. Les routes restent RESTful, et les requêtes fonctionnent même sur des hébergements restrictifs.
Comptes, rôles et validations
Le plugin ajoute deux rôles et un modèle de capacités. Il ne modifie les rôles natifs de WordPress que pour donner l’accès aux administrateurs.
| Rôle | Peut utiliser l’application | Peut gérer les titulaires de compte | Peut gérer les administrateurs de facturation et les rôles |
|---|---|---|---|
| Administrator | Oui | Oui | Oui |
| Invoice Manager Admin | Oui | Oui | Non |
| Invoice Account Holder | Oui | Non | Non |
Le rôle intermédiaire existe pour que, par exemple, la personne qui gère le bureau puisse approuver et accompagner les utilisateurs sans recevoir les clés de tout le site. Les administrateurs ne peuvent jamais être suspendus ni supprimés depuis l’application, et personne ne peut y supprimer son propre compte. Ce sont précisément les erreurs qui privent les gens de l’accès à leur propre site.
L’inscription publique est désactivée jusqu’à ce qu’un administrateur l’active. Le formulaire bénéficie alors de quatre protections :
- Un nonce.
- Un champ piège (honeypot) caché, que les robots remplissent et pas les humains.
- Une limite de cinq inscriptions par adresse réseau et par heure.
- Une longueur minimale de mot de passe.
Avec la validation activée, un nouveau compte peut se connecter, mais ne voit que le message « En attente d’approbation » jusqu’à ce qu’un administrateur l’approuve. L’utilisateur reçoit alors un e-mail. Suspendre un utilisateur le déconnecte immédiatement sur tous ses appareils, en supprimant ses sessions WordPress au lieu d’attendre l’expiration d’un cookie.
Une application plein écran que le thème ne peut pas casser
Une application de facturation doit avoir la même apparence et le même comportement sur tous les sites où elle est installée. Les styles de boutons d’un thème, les réinitialisations CSS d’un constructeur de pages ou l’optimiseur de scripts d’un plugin de cache peuvent subtilement casser une interface de type application. Le plugin prend donc entièrement en charge l’affichage de sa propre page.
Quand un visiteur ouvre la page de l’application, le plugin sert son propre modèle minimal à la place de celui du thème. Ce modèle n’affiche que la feuille de style et les scripts du plugin, via les fonctions standard de WordPress, et rien du thème ni des autres plugins. La page demande aussi aux caches de ne pas l’enregistrer et aux moteurs de recherche de ne pas l’indexer, car c’est une application, pas du contenu.
L’interface elle-même est écrite en modules JavaScript simples, sans framework, regroupés dans un seul fichier lisible. La navigation utilise des routes à base de hash : passer des factures aux clients et aux réglages ne recharge jamais la page, et le bouton « Retour » du navigateur fonctionne toujours. La police DM Sans est incluse dans le plugin au lieu d’être chargée depuis un service de polices : l’application n’effectue donc aucune requête vers des serveurs tiers.
La mise en page a été pensée pour le mobile dès le départ. Sur petit écran :
- La barre latérale devient un menu escamotable.
- Les tableaux de données deviennent des cartes empilées, avec un libellé sur chaque valeur.
- L’éditeur de facture se réorganise sur une seule colonne.
Les factures sont souvent vérifiées sur téléphone, quand un client affirme avoir payé.


Générer des factures PDF directement dans le navigateur
Générer des PDF côté serveur en PHP implique généralement des bibliothèques lourdes, des polices installées sur le serveur, des limites de mémoire et des résultats très différents d’un hébergeur à l’autre. Nous générons plutôt le PDF dans le navigateur de l’utilisateur :
- La facture est affichée sous forme de document HTML au format A4.
- Ce document est converti en image.
- L’image est placée dans un fichier PDF à l’aide de la bibliothèque open source html2pdf.js.
Cela présente trois avantages :
- Le PDF est identique à l’aperçu à l’écran, puisque c’est l’aperçu.
- Il fonctionne chez n’importe quel hébergeur.
- Aucune donnée de facturation n’est envoyée nulle part pour la conversion.
L’inconvénient : le texte du PDF est une image, et non du texte sélectionnable. Pour des factures destinées à être lues, imprimées et archivées, c’est un prix acceptable pour un résultat identique partout.
Les bugs que nous avons trouvés avant nos clients
Chacun de ces bugs est apparu sur un véritable écran. Ils méritent d’être décrits, car chacun illustre une catégorie d’erreurs que l’on retrouve dans d’autres projets.
La deuxième page blanche à cause d’un demi-pixel
Les factures d’une page se téléchargeaient en PDF de deux pages, la seconde étant blanche. La cause : le document à l’écran avait une hauteur minimale de 1123 pixels pour que l’aperçu ressemble à une feuille entière. Or un A4 à 96 DPI mesure 1122,5 pixels de haut. Ce demi-pixel de dépassement suffisait pour que la bibliothèque PDF commence une nouvelle page.
Le correctif supprime la hauteur minimale uniquement pendant l’export, de sorte que l’aperçu ressemble toujours à du papier. Nous l’avons vérifié en comptant les pages du PDF généré : deux avant le correctif, une après. Une facture de 45 lignes continue de passer correctement sur une deuxième page avec du contenu.
Un lien de déconnexion qui s’échappait lui-même
La fonction WordPress qui fournit l’URL de déconnexion renvoie une URL déjà échappée pour le HTML, avec les esperluettes écrites &. C’est correct dans un attribut HTML, mais pas en JavaScript : là, le caractère échappé cassait le jeton de sécurité, et donc la déconnexion. Le correctif décode l’URL une fois avant de la transmettre à l’application. Un petit bug, mais typique de la frontière entre les modèles PHP et JavaScript.
Des logos clients qui n’arrivaient jamais sur la facture
Le logo d’un client pouvait être téléversé et était bien enregistré, mais n’apparaissait jamais sur les factures. L’instantané copié dans chaque facture ne le contenait tout simplement pas. Le correctif comportait deux volets :
- Les nouvelles factures incluent désormais le logo dans l’instantané.
- Les factures enregistrées auparavant utilisent, à la lecture, le logo actuel du client associé, sans réécrire les données enregistrées.
Ne pas toucher aux données enregistrées pour corriger un problème d’affichage est une habitude qui vaut la peine d’être prise.
Une carte du tableau de bord qui contredisait le tableau
Après avoir marqué une facture comme payée dans la liste, la ligne du tableau passait au vert, mais la carte « Factures récentes » au-dessus affichait toujours Unpaid jusqu’au rechargement de la page. Deux vues des mêmes données s’étaient désynchronisées. Désormais, chaque action qui modifie une facture redessine tout l’écran avec des données fraîches, et tous les chiffres de la page concordent toujours.
L’alignement après l’ajout d’un logo
Avec le logo du client au-dessus de l’adresse, le bloc « To » commençait plus bas que le bloc « From », et la facture paraissait déséquilibrée. La solution a été de placer le logo à droite de l’adresse : les deux blocs commencent sur la même ligne, et le logo s’aligne avec le numéro de facture au-dessus. Nous avons ensuite donné un peu plus de largeur à la colonne du client pour qu’une adresse suisse typique tienne sur une ligne. La leçon : testez les mises en page de factures avec de vraies données clients, car les noms fictifs sont toujours commodément courts.
Préparer le plugin pour le répertoire WordPress.org
Un code qui fonctionne sur votre propre site et un code qui passe la revue de WordPress.org, ce n’est pas la même chose. Le répertoire a ses propres règles, et nous avons ajusté plusieurs points avant la soumission pour les respecter.
- Aucun appel à des serveurs externes. La police était au départ chargée depuis un service de polices, ce qui transmettait l’adresse IP de chaque visiteur à un tiers. Elle est désormais incluse dans le plugin, sous sa licence libre.
- Scripts et styles via les fonctions de WordPress. Les balises script et link écrites en dur ont été remplacées par des ressources enregistrées et versionnées. La configuration d’exécution est transmise par le mécanisme standard des scripts en ligne.
- Un code source lisible. Le répertoire n’accepte pas de code minifié sans ses sources. Le bundle de l’application est livré non minifié, avec les modules d’origine, et le readme explique comment le recompiler.
- Licences tierces déclarées. La bibliothèque PDF et la police figurent dans le readme avec leur licence et un lien vers la source, et les fichiers de licence sont fournis avec le plugin.
- Aucun hook du cœur déclenché par le plugin. Une première version déclenchait l’action de connexion native de WordPress après l’inscription. Aujourd’hui, le plugin gère la connexion avec son propre code.
- Désinstallation uniquement avec consentement. Supprimer le plugin n’efface rien tant que l’administrateur n’a pas explicitement demandé la suppression des données. Les factures sont des documents comptables, et les perdre par un clic malencontreux est inacceptable.
- Un readme complet avec description courte, étapes d’installation, FAQ, section confidentialité et journal des modifications. Le code est conçu pour passer sans erreur l’outil officiel Plugin Check.
Aucune de ces règles n’a dégradé le plugin, et certaines l’ont amélioré. Inclure la police, par exemple, a complètement éliminé une question de confidentialité.
Plugin de facturation WordPress sur mesure ou solution existante ?
Soyons honnêtes : la plupart des entreprises ne devraient pas faire développer un outil de facturation sur mesure. Si une seule personne émet quelques factures par mois dans une seule devise, un produit existant lui convient très bien et coûte moins cher que n’importe quel développement sur mesure. Le sur-mesure devient la meilleure option lorsque plusieurs des points suivants s’appliquent :
- Plusieurs personnes ont besoin d’une facturation séparée et cloisonnée dans un même système, et la tarification par utilisateur devient sensible.
- La facturation doit être reliée à un élément propre à votre activité, comme un système de réservation, un outil de gestion de projets, un ERP ou un portail client.
- Vous facturez dans plusieurs devises et avez besoin de totaux qui ne sont jamais convertis à votre insu.
- Vos factures exigent des règles que les outils standard ne gèrent pas, comme des étapes de validation, des types de documents ou des séquences de numérotation spécifiques.
- Vous voulez que vos données financières restent sur une infrastructure qui vous appartient et que vous sauvegardez et contrôlez vous-même.
Si un seul de ces points s’applique, examinez d’abord de plus près les produits existants. Si trois ou plus s’appliquent, un plugin ciblé comme celui-ci coûte généralement moins cher, sur deux à trois ans, que les abonnements et les solutions de contournement qu’il remplace. Et il fait exactement ce dont vous avez besoin.
Quel que soit votre choix, évaluez tout outil de facturation à l’aune des points abordés dans cet article :
- Conserve-t-il un état figé de chaque facture, pour que les modifications ultérieures de vos informations ou de celles d’un client ne réécrivent pas les anciennes factures ?
- Calcule-t-il le statut à partir des paiements au lieu de l’enregistrer ?
- Garde-t-il les devises séparées ?
- Cloisonne-t-il les utilisateurs entre eux ?
- Pouvez-vous accéder à vos données à tout moment ?
Questions fréquentes
Un plugin de facturation WordPress peut-il gérer plusieurs utilisateurs ?
Oui, s’il est conçu pour cela. Dans ArtinTech Invoice Manager, chaque facture et chaque client appartiennent au titulaire de compte qui les a créés, et l’API vérifie la propriété à chaque requête. Chaque utilisateur a ses propres réglages, logo, numérotation et coordonnées bancaires, et ne peut pas voir les données des autres.
Le plugin envoie-t-il des données de facturation à des services tiers ?
Non. Tout est stocké dans la base de données WordPress du site. Les PDF sont générés dans le navigateur de l’utilisateur et la police est incluse dans le plugin. Les seuls messages sortants sont les e-mails WordPress habituels, comme les notifications d’inscription et d’approbation.
Peut-il créer des factures dans différentes devises ?
Oui. Chaque facture a sa propre devise, et le tableau de bord comme les pages clients affichent les totaux séparément par devise. Rien n’est converti, de sorte que les chiffres correspondent toujours aux factures réellement envoyées.
Fonctionne-t-il avec mon thème ou mon constructeur de pages ?
Oui. La page de l’application est affichée avec le modèle et les ressources propres au plugin. Ni le thème, ni Elementor, ni aucun autre constructeur de pages ne peuvent modifier son apparence ou son comportement. Le reste de votre site n’est absolument pas affecté.
Le plugin est-il disponible sur WordPress.org ?
Nous l’avons préparé pour le répertoire de plugins WordPress.org, et il y sera référencé dès qu’il aura passé la revue. Si vous souhaitez l’utiliser d’ici là, ou si vous avez besoin d’une version adaptée à votre façon de travailler, contactez-nous.
Pouvez-vous développer une version sur mesure pour mon entreprise ?
Oui. Des mises en page de factures personnalisées, des types de documents supplémentaires, la connexion à un système de réservation ou de gestion de projets, des portails clients et des circuits de validation sont des extensions naturelles de la même base. Découvrez comment nous cadrons ce type de projet sur notre page développement de plugins WordPress.
Créer des outils WordPress comme celui-ci est au cœur de notre activité. Certains sont de petits correctifs, comme l’erreur 403 liée au cache que nous avons attribuée à la durée de vie d’un nonce. D’autres sont des applications complètes comme celle-ci, réalisées dans le cadre de notre développement WordPress et de notre développement CMS et ERP sur mesure. Si vous étudiez un outil de facturation, ou tout autre logiciel que votre entreprise doit sans cesse contourner, parlons-en. Vous obtiendrez un avis honnête, même si la réponse est qu’un produit existant suffit.