# Thème et Sendinblue : formulaire d’inscription à un webinaire dans un template page

> Ni widget iframe ni plugin de newsletter généraliste : appel direct à l'API Sendinblue pour un formulaire d'inscription à un webinaire natif, intégré à un template de page du thème.

- Auteur : WordPress Développement
- Publié le : 2022-08-13
- Mis à jour le : 2022-08-13
- Catégorie : Thèmes
- URL : https://www.wpmoderne.fr/themes/theme-brevo-formulaire-inscription-webinaire/

## L’essentiel

- Le formulaire reste un template natif du thème, sans widget externe
- Un seul appel API contacts suffit pour l'inscription
- La liste de diffusion se gère entièrement côté Sendinblue

Comment connecter un formulaire d'inscription à un webinaire, intégré dans un template de page du thème, à un outil d'emailing sans passer par un widget iframe qui casserait la charte graphique de la page ? Cette question s'est posée pour une entreprise qui organisait des webinaires mensuels et voulait un formulaire d'inscription entièrement natif à son site, tout en ajoutant automatiquement chaque inscrit à une liste de diffusion Sendinblue dédiée aux futurs webinaires.

## Le template de page dédié

Un template `page-webinaire.php` affiche le contenu de présentation du webinaire (rédigé depuis l'éditeur de la page) puis un formulaire minimal, sans dépendance à un script embarqué externe :

```
<?php
/* Template Name: Inscription webinaire */
get_header();
the_content();
?>
<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
    <input type="hidden" name="action" value="inscription_webinaire">
    <?php wp_nonce_field( 'inscription_webinaire', 'webinaire_nonce' ); ?>
    <label for="prenom">Prénom</label>
    <input type="text" id="prenom" name="prenom" required>
    <label for="email_webinaire">Adresse e-mail</label>
    <input type="email" id="email_webinaire" name="email" required>
    <button type="submit">S'inscrire au webinaire</button>
</form>
<?php get_footer(); ?>
```

## Appeler l'API contacts de Sendinblue

Le traitement de la soumission, accroché sur `admin_post`, appelle l'endpoint contacts de l'API Sendinblue via `wp_remote_post()`, avec la clé API stockée en variable d'environnement :

> L'essentiel à retenir : Le formulaire reste un template natif du thème, sans widget externe ; Un seul appel API contacts suffit pour l'inscription ; La liste de diffusion se gère entièrement côté Sendinblue

```
add_action( 'admin_post_inscription_webinaire', function() {
    check_admin_referer( 'inscription_webinaire', 'webinaire_nonce' );

    $prenom = sanitize_text_field( $_POST['prenom'] ?? '' );
    $email  = sanitize_email( $_POST['email'] ?? '' );

    if ( ! is_email( $email ) || empty( $prenom ) ) {
        wp_redirect( add_query_arg( 'webinaire', 'erreur', wp_get_referer() ) );
        exit;
    }

    $reponse = wp_remote_post(
        'https://api.sendinblue.com/v3/contacts',
        array(
            'headers' => array(
                'api-key'      => getenv( 'SENDINBLUE_API_KEY' ),
                'Content-Type' => 'application/json',
            ),
            'body' => wp_json_encode( array(
                'email' => $email,
                'attributes' => array( 'PRENOM' => $prenom ),
                'listIds' => array( (int) getenv( 'SENDINBLUE_LISTE_WEBINAIRE' ) ),
            ) ),
        )
    );

    $code   = is_wp_error( $reponse ) ? 0 : wp_remote_retrieve_response_code( $reponse );
    $statut = in_array( $code, array( 200, 201 ), true ) ? 'merci' : 'erreur';

    wp_redirect( add_query_arg( 'webinaire', $statut, wp_get_referer() ) );
    exit;
} );
add_action( 'admin_post_nopriv_inscription_webinaire', function() {
    do_action( 'admin_post_inscription_webinaire' );
} );
```

## Gérer le cas du contact déjà existant

Un inscrit à un webinaire précédent, déjà présent dans la base Sendinblue, provoque un code de réponse `400` avec un message d'erreur `duplicate_parameter` plutôt qu'un succès. Ce cas a été traité explicitement pour ne pas afficher une erreur trompeuse à un contact simplement déjà inscrit à la liste :

```
$corps_reponse = json_decode( wp_remote_retrieve_body( $reponse ), true );
if ( 400 === $code && isset( $corps_reponse['code'] ) && 'duplicate_parameter' === $corps_reponse['code'] ) {
    $statut = 'merci';
}
```

## Message de confirmation adapté

Le template lit le paramètre de retour pour afficher un message cohérent, sans rechargement Ajax supplémentaire :

```
<?php if ( 'merci' === ( $_GET['webinaire'] ?? '' ) ) : ?>
    <p class="webinaire-message">Inscription confirmée. Le lien de connexion vous sera envoyé la veille du webinaire.</p>
<?php elseif ( 'erreur' === ( $_GET['webinaire'] ?? '' ) ) : ?>
    <p class="webinaire-message webinaire-erreur">Une erreur est survenue, merci de vérifier votre adresse e-mail.</p>
<?php endif; ?>
```

## Ce qui reste entièrement côté Sendinblue

Cette intégration se limite à l'inscription d'un contact sur une liste. L'envoi du lien de connexion au webinaire, la relance automatique des inscrits n'ayant pas ouvert l'e-mail de confirmation, ainsi que le suivi des taux d'ouverture, restent configurés et pilotés entièrement depuis l'interface Sendinblue, hors du périmètre du thème.

## En résumé

Un formulaire natif au thème, relié directement à l'API contacts de Sendinblue, évite le widget iframe standard tout en gardant l'inscription simple : deux champs, un appel API, et une liste de diffusion tenue à jour automatiquement sans plugin de newsletter généraliste.
