Permettre à vos utilisateurs de remplir un formulaire modifiable dans leur zone privée, cela peut être sympa. Profil ou autre, d’ailleurs, l’idée ici est de voir comment on peut utiliser un formulaire WPForms pour afficher des données utilisateurs stockées dans la base de données. En résumé, utiliser un formulaire WPForms en mode modification, ce qui n’est pas possible nativement avec ce super plugin. Pour illustrer notre exemple nous allons utiliser un formulaire simple avec quelques infos de base concernant un utilisateur et nous stockerons ces infos dans la table SQL wp_usermeta afin de les réutiliser dans notre formulaire en mode modification. L’exemple ci-dessous n’a aucun intérêt et vous ne l’utiliserez pas. Il est uniquement destiné à manipuler les données dans WPForms.

Préparation du formulaire

Créez un nouveau formulaire WPForms (vous devez disposer de la version Pro). Créez les champs texte Prénom, Nom, Pays + un paragraphe Biographie + un champ masqué user_id. Rendez vos champs obligatoires pour éviter les entrées vides.
Dans l’onglet Avancé de chaque champ, repérez la zone “Valeur par défaut”. Pour chaque champ remplissez comme suit :

  • Prénom : {user_prenom}
  • Nom : {user_nom}
  • Pays : {user_pays}
  • Biographie : {user_biographie}
  • Pour le champ masqué user_id, cliquez sur “Afficher les étiquettes intelligentes” et sélectionnez ID du compte, ce qui va remplir la valeur {user_id}.

Note : WPForms dispose d’un système “d’étiquettes intelligentes” qui vous permettent de sélectionner des valeurs qui seront remplacées par les valeurs réelles si elles sont trouvées. D’ailleurs vous verrez que celles que je donne en exemple sont présentes par défaut, par exemple {user_first_name}. Encore une fois, il s’agit d’un exercice. Cela fait vous devez obtenir :

Ce qui nous donne :

Enregistrement des données du formulaire

Dans le fichier functions.php de votre thème enfant (ou un fichier functions-forms.php inclus) ou dans un fichier de plugin dédié, copiez la fonction de récupération / enregistrement des données :

				
					add_action( 'wpforms_process_complete', 'traite_form_profil', 10, 4 );

function traite_form_profil($fields, $entry, $form_data, $entry_id){
	
	if ( absint( $form_data['id'] ) !== 380 ) {//ici l'ID de votre formulaire
		return;
	}
     
    // Récupérer l'objet de toutes les entrées
    $entry = wpforms()->entry->get( $entry_id );
    $data = json_decode( $entry->fields, true );
	$user_id = sanitize_text_field($data[7]['value']);
	//Le chiffre [7] correspond à l'ID du champ user_id. Remplacez le par votre ID de champ.
	
	if(empty($user_id)){
		return; //pas de user_id dans le champ masqué, on bloque. 
		//Cela signifie que l'utilisateur n'est pas connecté
	}
	
	$user_prenom = sanitize_text_field($data[1]['value']);
	if(!empty($user_prenom)){
		update_user_meta($user_id, 'user_prenom', $user_prenom);
		//on enregistre la usermeta en passant le user_id, la clef de la meta et sa value
	}
	
	$user_nom = sanitize_text_field($data[2]['value']);
	if(!empty($user_nom)){
		update_user_meta($user_id, 'user_nom', $user_nom);
	}
	
	$user_pays = sanitize_text_field($data[5]['value']);
	if(!empty($user_pays)){
		update_user_meta($user_id, 'user_pays', $user_pays);
	}
	
	$user_biographie = sanitize_textarea_field($data[6]['value']);
	if(!empty($user_biographie)){
		update_user_meta($user_id, 'user_biographie', $user_biographie);
	}
	
	update_user_meta($user_id, 'formulaire_rempli', 1);
	//On créé une usermeta 'formulaire_rempli' avec la valeur 1.<br>
	//Elle nous servira pour tester si l'utilisateur a posté au moins une fois
}

				
			

Nos données sont à présent enregistrées dans la base.

Le formulaire en mode modification

Nos données étant enregistrées dans la base, nous allons pouvoir les récupérer et les afficher dans les différents champs du formulaire. Toujours dans le fichier functions.php du thème enfant ou dans votre plugin dédié, collez cette fonction :

				
					add_filter( 'wpforms_smart_tag_process', 'set_wpforms_profil', 10, 2 );

function set_wpforms_profil( $content, $tag ) {
	global $wpdb;
	
	$user_id = get_current_user_id();
	if ( !is_user_logged_in() ) {
    	// Rediriger vers la page de login avec une redirection vers la page actuelle après connexion
    	$login_url = wp_login_url( get_permalink() );
    	wp_redirect( $login_url );
    	exit;
	}
	
	//je teste si le formulaire a déjà été posté par ce user grâce à la<br>
	//meta 'formulaire_rempli' et si oui je modifie le bouton du formulaire
	$formulaire_rempli = get_user_meta($user_id, 'formulaire_rempli', true);

	if ($formulaire_rempli == 1) {
		// L'utilisateur a déjà rempli le formulaire
		add_action( 'wpforms_wp_footer_end', 'wpf_change_button_submit', 30 );
		// J'appelle la fonction qui modifie le bouton (facultatif - voir la fonction ci-après)
	}
	
	$datas = array('prenom', 'nom', 'pays', 'biographie');
	// array avec les données
	
	foreach ($datas as $data) {
		// Construire la balise dynamique, comme {user_prenom}, {user_nom}, etc.
		$smart_tag = "user_{$data}";
		
		// Comparer la balise dynamique avec le tag actuel sans accolades
		if ( $smart_tag === $tag ) {
			// Récupérer la valeur de la méta pour l'utilisateur connecté
			$meta_value = get_user_meta( $user_id, $smart_tag, true );
			
			// Si la valeur existe, remplacer la balise dans le contenu
			if ( !empty($meta_value) ) {
				// Remplacer {user_xxx} dans le contenu par la valeur de la méta
				$content = str_replace( '{' . $smart_tag . '}', $meta_value, $content );
			} else {
				// Si pas de méta, remplacer par une chaîne vide
				$content = str_replace( '{' . $smart_tag . '}', '', $content );
			}
			
			break; // Sortir de la boucle une fois la balise trouvée
		}
	}
	
    return $content;
}

add_action( 'wpforms_process_complete', 'traite_form_profil', 10, 4 );



				
			

Explication de la fonction de remplacement

Que fait cette fonction ? Nous utilisons le filtre WPForms wpforms_smart_tag_process qui est prévu pour remplacer les tags {user_prenom} et les autres par les valeurs de la table wp_usermeta. Pour gagner du temps plutôt que de tester chaque tag, j’ai construit un petit array() $datas que je parcours avec une simple boucle foreach() à laquelle j’ajoute un break; si la valeur est trouvée. Avec get_user_meta($user_id, $smart_tag, true) je récupère la valeur de la clef ‘user_prenom’ et autres pour le user_id considéré. Puis, si la valeur de la clef n’est pas vide, j’utilise un simple str_replace() pour remplacer {user_prenom} par la valeur stockée dans wp_usermeta. Si il n’y a aucune donnée enregistrée dans la table wp_usermeta pour la clef considérée, je remplace {user_prenom} ou autre par ‘ ‘, ce qui revient à dire que je vide le champ.

Fonction pour modifier le texte du bouton en mode modification

				
					//hook pour modifier le bouton submit en mode modification
function wpf_change_button_submit( ) {
?>
 
<script type="text/javascript">
 
    jQuery(function($){
 
        $( '#wpforms-submit-380' ).html( 'Modifier votre profil' );
        //380 à remplacer par votre ID de formulaire
    });
 
    </script>
 
<?php
}
				
			

Résultat

Laisser un commentaire