Home » wordpress » Préremplir les champs d’un formulaire à l’aide d’une chaîne de requête
Préremplir les champs d’un formulaire à l’aide d’une chaîne de requête
Comment personnaliser ses formulaires et les rendre dynamiques ?
Voici un tutoriel complet sur la possibilité de préremplir certains champs de formulaire.
Ce dont on a besoin
Nous allons ici utiliser :
un custom post type
Un widget
un formulaire Ninja form
des champs additionnels ACF
Le scénario
Le scénario est le suivant. Nous sommes dans un article ou un custom post type « formation ». Il s’agit de cours informatiques, répartis par catégories et par niveaux. Chaque post doit contenir des dates et des lieux spécifiques. Ces informations sont des « champ additionnels » ou « cutom fields » crées à l’aide d’ACF.
Dans la sidebar, on a un widget qui affiche les formations à venir. On les regroupe par ville puis par date de début et de fin.
Ces dernières sont entourées d’un lien dynamique qui doit renvoyer vers notre formulaire, en pré-remplissant certains champs. Par exemple, si je suis dans un article dont le titre est « python expert », et que je clique sur le premier lien « Orléans, du 18/05/2020 au 22/50/2020 », mon formulaire affichera alors en en-tête le titre et les informations de ville et de dates, comme ci-dessous.
Lorsque l’utilisateur valide le formulaire, on reçoit alors un mail indiquant entre autre les préférences de lieu et de date.
C’est parti !
Le custom post type
Notre custom post formation a deux taxonomies, une pour les catégories de formation, une deuxième pour le niveau des formations. Je mets ici le code entier de mon CPT.
function cc_formation_cpt() { /* Formation */ $labels = array( 'name' => _x('Formations', 'Post Type General Name', 'text_domain'), 'singular_name' => _x('Formation', 'Post Type Singular Name', 'text_domain'), 'menu_name' => _x('Formations', 'text_domain'), 'name_admin_bar' => _x('Formations', 'text_domain'), 'all_items' => _x('Toutes les formations', 'text_domain'), 'add_new_item' => _x('Ajouter une nouvelle formation', 'text_domain'), 'add_new' => _x('Ajouter', 'text_domain'), 'new_item' => _x('Nouvelle formation', 'text_domain' ), 'edit_item' => _x('Editer la formation', 'text_domain'), 'update_item' => _x('Mettre à jour la formation', 'text_domain'), 'view_item' => _x('Voir la formation', 'text_domain'), 'search_items' => _x('Rechercher une formation', 'text_domain'), 'not_found' => _x('Aucune formation trouvée', 'text_domain'), 'not_found_in_trash' => _x('Aucune formation trouvée dans la corbeille', 'text_domain'), );
$labels_cat_formation = array( 'name' => _x( 'Catégories de la formation', 'taxonomy general name'), 'singular_name' => _x( 'Catégories de la formation', 'taxonomy singular name'), 'search_items' => __( 'Rechercher une catégorie'), 'popular_items' => __( 'Catégories populaires'), 'all_items' => __( 'Toutes les catégories'), 'edit_item' => __( 'Editer une catégorie'), 'update_item' => __( 'Mettre à jour une catégorie'), 'add_new_item' => __( 'Ajouter une nouvelle catégorie'), 'new_item_name' => __( 'Nom de la nouvelle catégorie'), 'add_or_remove_items' => __( 'Ajouter ou supprimer une catégorie'), 'choose_from_most_used' => __( 'Choisir parmi les catégories les plus utilisées'), 'not_found' => __( 'Pas de catégories trouvée'), 'menu_name' => __( 'Catégorie de formation'), );
$labels_level_formation = array( 'name' => _x( 'Niveaux de la formation', 'taxonomy general name'), 'singular_name' => _x( 'Niveau de la formation', 'taxonomy singular name'), 'search_items' => __( 'Rechercher un niveau'), 'popular_items' => __( 'Niveaux populaires'), 'all_items' => __( 'Tous les Niveaux'), 'edit_item' => __( 'Editer un niveau'), 'update_item' => __( 'Mettre à jour un niveau'), 'add_new_item' => __( 'Ajouter un nouveau niveau'), 'new_item_name' => __( 'Nom de le nouveau niveau'), 'add_or_remove_items' => __( 'Ajouter ou supprimer un niveau'), 'choose_from_most_used' => __( 'Choisir parmi les nivexau les plus utilisées'), 'not_found' => __( 'Pas de niveau trouvé'), 'menu_name' => __( 'Niveau de formation'), );
Depuis le backoffice et les options d’Acf, je rajoute mes trois champs ville, date de début et date de fin.
Champ ville ou location
Pour le champ « ville », je choisi un champ select et renseigne les différentes options.
Champ date
Pour le champ « date_de_debut » et « date_de_fin« , je choisir le type « date » et son format.
Enfin, je précise les conditions d’affichage : ici le « type de publication » doit être égal à « Formation » (le nom de mon custom post type.)
Dans mon projet, je n’affiche pas ces champs dans le fichier single-formation. Ces articles ne doivent pas contenir de dates ni de lieu attitrés. Mais ces informations sont bien enregistrées en base de donnée au moment de l’édition du CPT. On va donc pouvoir les récupérer et les afficher ailleurs.
Le widget des « formations à venir »
Voici le code complet de mon widget.
class Cc_Upcoming_Events extends WP_Widget { function __construct() { parent::__construct( 'cc_upcoming_events', // Base ID __( 'Cc Upcoming Events', 'text_domain' ), // Name array( 'description' => __( 'Shows Formations dates', 'text_domain' ), ) // Args ); }
Dans la fonction « form« , on a plusieurs champs select : un pour le nombre de post à afficher, un second pour ma taxonomie « catégorie », un dernier pour ma taxonomie « niveau ».
Pour pouvoir boucler sur notre CPT en fonction de ces deux taxonomies et des terms sélectionnés par l’utilisateur, on va créer la boucle avec une « multiple tax_query » comme expliqué dans le codex
Le reste du code nous permet, à travers des boucles imbriquées, d’afficher les custom post type, en les regroupant par ville. On a ainsi une répartition avec la ville en titre, et tous les CPT enregistrés avec la même ville dans une liste juste en dessous.
Le lien dynamique et notre query string
Dans le dernier foreach, on récupère nos custom field « date_de_debut » et « date_de_fin« , et on construit le lien avec notre requête dynamique. Je récupère aussi le titre de l’article avec $title = get_the_title(); , et les champs ACF.
Avec la version gratuite de Ninja Form, construisez votre formulaire. Un tuto explique très bien comment créer et récupérer les données d’un lien dynamique dans Ninja Form.
Créer deux champs additionnels pour mes « query string »
Pour suivre mon exemple, je vais donc devoir créer deux champs additionnels : un pour afficher le titre du CPT de provenance, l’autre pour afficher les valeurs de mes champs ACF.
Je crée donc deux « lignes de texte« .
Querystring pour le titre du CPT
On efface les libellés, et dans les restrictions, on désactive la saisie. Si les restrictions ne s’affichent pas, il faut retourner dans les options du plugin et activer le mode « développeur ».
Dans l’affichage, je définis comme valeur par défaut ma première query string : {querystring:titre}. Le champ va donc récupérer ici ma variable titre insérée plus tôt dans mon lien.
Si je suis dans une formation dont le titre est « python expert » par exemple, je le retrouverai donc dans mon formulaire. On peut ensuite le styliser, comme ci-dessous.
Dans les « noms de classe personnalisées« , j’ajoute mes classes qui vont justement me servir à styliser mon titre : enlever les bordures, changer la taille de police, modifier les marges etc.
Querystring pour la ville et les dates
Mon deuxième champ va me permettre de récupérer les informations de ville et de dates envoyés depuis mon widget.
Ici aussi j’efface le libellé, je désactive la saisie. Je personnalise la valeur de ma chaîne de requête avec du texte additionnel. Je nomme mes tags exactement de la même manière que dans mon lien dynamique : {querystring:date_de_debut}, {querystring:date_de_fin} et {querystring:ville}. :
Si pour une raison quelconque l’utilisateur peut accéder à la page du formulaire sans passer par le widget, il se peut que vous ayez envie de cacher l’en-tête. Sinon on verra une mention « Session du au », ce qui pourra paraître bizarre.
Dans ce cas, on peut tout à fait ne laisser que {querystring:date_de_debut}, {querystring:date_de_fin}{querystring:ville}. dans le champ « valeur par défaut » de ninja form et ajouter ces informations dans le html directement
&ville= à ‘. $city .’&date_de_debut= Session du’ . $event_start_date .’&date_de_fin= au ‘ . $event_end_date
Tester !!
Maintenant, au clic sur une des dates de mon widget, je suis redirigé vers mon formulaire, c’est la partie « http://localhost/monsite/inscription/ » de mon lien. Si vous avez bien fait les choses, vous verrez dans l’url vos query après le « ? » et les valeurs correspondantes à chaque query string.
N’hésitez pas, si vous avez des idées d’amélioration ou des corrections à apporter à ce tuto !