Trois façons de poser le formulaire, de la plus simple à la plus souple. Toutes utilisent la même clé publique et le même contrôle de domaine.
Prérequis : la clé publique et le domaine déclaré (voir le README, étapes 1 et 2).
C'est celle qu'on utilise en premier. Aucun code PHP, aucun plugin à maintenir.
Apparence → Personnaliser → Code supplémentaire, ou le champ « Scripts de pied de page » de votre thème, ou un plugin de type Insert Headers and Footers. Dans le pied de page :
<script src="https://messagerie.inovertix.com/inocampagne.js" data-marque="INOCMP_PUB_votre_cle_publique" data-endpoint="https://messagerie.inovertix.com/api/inocampagne/public" defer></script>
Là où le formulaire doit apparaître, un bloc HTML personnalisé (Gutenberg : « + » → HTML personnalisé ; Elementor : widget « HTML ») contenant exactement :
<div data-inocampagne-form></div>
C'est tout. Vous pouvez en poser plusieurs : un dans le pied de page (via un widget), un au milieu d'un article, un sur une page dédiée.
L'éditeur WordPress supprime parfois les attributs qu'il ne connaît pas dans un bloc Paragraphe. Utilisez toujours un bloc HTML personnalisé : lui préserve data-inocampagne-form tel quel.
data-inocampagne-form
Pour que les rédacteurs puissent poser le formulaire avec [inocampagne] sans toucher à du HTML. Dans le functions.php du thème enfant (jamais celui du thème parent : une mise à jour l'écraserait) :
[inocampagne]
functions.php
<?php /** * INOCAMPAGNE — formulaire d'inscription. * * Le script est enregistré UNE fois et chargé seulement sur les pages qui utilisent le * shortcode : inutile de le servir sur les 400 articles du blog. */ add_action('wp_enqueue_scripts', function () { wp_register_script( 'inocampagne', 39;https://messagerie.inovertix.com/inocampagne.js', [], null, // pas de version : le fichier porte déjà son propre ETag côté CONTROL true // dans le pied de page ); }); /** * Ajoute les attributs `data-` à la balise. * * `wp_enqueue_script` ne sait pas poser d'attributs personnalisés : on filtre la balise * produite. C'est la méthode propre — modifier le HTML à la main réintroduirait le script * sur toutes les pages. */ add_filter('script_loader_tag', function (string $tag, string $handle): string { if ($handle !== 'inocampagne') { return $tag; } return str_replace( ' src=', ' data-marque="INOCMP_PUB_votre_cle_publique"' .39; data-endpoint="https://messagerie.inovertix.com/api/inocampagne/public"' .' defer src=', $tag ); }, 10, 2); /** [inocampagne] — le conteneur, et le chargement du script à la demande. */ add_shortcode('inocampagne', function (): string { wp_enqueue_script('inocampagne'); return '<div data-inocampagne-form></div>'; });
Usage dans un article, une page ou un widget « Texte » :
Si le site a déjà un formulaire INODESK, n'ajoutez pas un second formulaire : ajoutez-lui une case à cocher dont la clé est exactement newsletter_optin.
newsletter_optin
CONTROL → INODESK → Formulaires → votre formulaire → ajouter un champ :
Cochée, elle passe le contact en opt_in pour la marque du site, avec pour preuve l'identifiant de la soumission et sa date. Non cochée ou absente : rien ne change — un formulaire de contact n'est pas un consentement.
opt_in
C'est la façon la plus économique d'alimenter la base : le formulaire existe déjà, il tourne déjà, il suffit d'une case.
Jamais « obligatoire », jamais pré-cochée. Un consentement contraint n'est pas un consentement, et il se paie en plaintes pour spam — qui coûtent la réputation du domaine d'envoi, donc toutes les campagnes de toutes les marques.
Deux options, et la première suffit dans la plupart des cas.
Ne faites rien. Un achat sur une boutique rattachée à la marque pose automatiquement le statut client sur le profil, et un client est adressable. Vos acheteurs sont déjà joignables, sans une ligne de code.
client
La case newsletter reste utile pour obtenir un opt-in explicite — un consentement plus fort — mais elle n'est pas nécessaire pour pouvoir écrire.
Dans le functions.php du thème enfant :
<?php /** WooCommerce — case newsletter au checkout. Jamais pré-cochée. */ add_action('woocommerce_review_order_before_submit', function () { woocommerce_form_field('inocampagne_optin', [ 'type' => 'checkbox', 'class' => ['form-row', 'inocampagne-optin'], 'label' => 'Je souhaite recevoir les nouveautés et offres par email.', 'required' => false, ], false); // ← valeur par défaut : décochée }); /** * À la validation de la commande, l'inscription part depuis le SERVEUR, avec la clé * secrète. Elle ne doit jamais atteindre le navigateur. * * L'appel est enveloppé : une panne de CONTROL ne doit JAMAIS faire échouer une commande. * Un opt-in perdu se rattrape ; une commande perdue, non. */ add_action('woocommerce_checkout_order_processed', function (int $order_id) { if (empty($_POST['inocampagne_optin'])) { return; } $order = wc_get_order($order_id); if (! $order) { return; } wp_remote_post( 39;https://messagerie.inovertix.com/api/inocampagne/public/subscribe', [ 'timeout' => 5, // Non bloquant : la page de confirmation ne doit pas attendre notre réponse. 'blocking' => false, 'headers' => [ // Clé SECRÈTE, dans l'en-tête. Stockée en constante dans wp-config.php, // jamais dans le thème et jamais dans la base. 'Authorization' => 'Bearer '.INOCAMPAGNE_SECRET_KEY, 'Content-Type' => 'application/json', ], 'body' => wp_json_encode([ 'email' => $order->get_billing_email(), 'first_name' => $order->get_billing_first_name(), 'phone' => $order->get_billing_phone(), 'source_url' => home_url('/'), ]), ] ); });
Et dans wp-config.php, au-dessus de la ligne /* That's all, stop editing! */ :
wp-config.php
/* That's all, stop editing! */
define('INOCAMPAGNE_SECRET_KEY', 'INOCMP_SEC_votre_cle_secrete');
Pourquoi wp-config.php et pas la base de données ? Une clé secrète dans une option WordPress se retrouve dans chaque export de base, chaque sauvegarde, et chaque plugin qui lit wp_options. Dans wp-config.php, elle reste au niveau du serveur.
wp_options
Le bloc HTML n'a pas été nettoyé : ouvrez le code source de la page publique et vérifiez que data-inocampagne-form y est bien ;
Une inscription passe : votre adresse apparaît dans CONTROL → INOCAMPAGNE → Profils, provenance « Formulaire /news » ;
Le cache est vidé après la pose du script (WP Rocket, LiteSpeed, Cloudflare : tous servent l'ancienne page pendant des heures sinon) ;
WooCommerce, le cas échéant : une commande case cochée produit un opt_in, la même sans la case n'en produit pas ;
La clé secrète n'est nulle part dans le HTML : Ctrl+U sur la page, chercher INOCMP_SEC_. Rien ne doit sortir.
Ctrl+U
INOCMP_SEC_
<div>
inocampagne.js
403 origin_not_allowed
www.
woocommerce_checkout_after_terms_and_conditions
Le reste du dépannage vit dans le README.