WordPress – personnaliser les champs du formulaire de commentaire

Cet article a 385 jours. Il commence à dater, lisez-le donc en gardant son âge en tête ! Merci

WordPress possède un formulaire de commentaire adapté à la plupart des blogs. Cependant, comment s’y prendre si vous souhaitez ajouter ou supprimer des champs et personnaliser l’affichage des commentaires ?

WordPress prévoit la possibilité de personnaliser le formulaire de commentaire grâce à la fonction comment_form( $args, $post_id ), cette fonction est intéressante mais quelque peu limitée. Nous allons plutôt aborder quelques crochets (hooks) s’y rapprochant.

Concrètement, il faut procéder en trois étapes :

  • insérer ou supprimer un champ dans le formulaire
  • permettre l’insertion des données renseignées dans la base de données
  • afficher les nouvelles données dans les commentaires

Je vous invite à éditer votre fichier functions.php pour effectuer des tests avec les codes que je vais fournir.
Allez, c’parti !

Insérer et supprimer des champs dans le formulaire de commentaire

Cette première étape va utiliser le hook comment_form_defaults et se présente sous la forme d’une manipulation de tableau PHP.
Les champs sont enregistrés dans l’entrée « fields » du tableau et peuvent être manipulés assez simplement. Ils contiennent du code HTML que nous allons reproduire pour nos champs personnalisés.

add_filter( 'comment_form_defaults', 'juiz_manage_default_fields');
 
// $default contient tous les messages du formulaire de commentaire
// il contient également "comment_field", le textarea du message
 
if ( !function_exists('juiz_manage_default_fields')) {
   function juiz_manage_default_fields( $default ) {
 
      // Récupération des infos connues sur le visiteur
      // Permet de pré-remplir nos nouveaux champs
 
      $commenter = wp_get_current_commenter();
 
      // Suppression d'un champ par défaut parmi : author, email, url
 
      unset ( $default['fields']['url'] );
 
      // Ajout des champs dans le tableau "fields"
      // $commenter[] contient les infos sur le visiteur
 
      $default['fields']['job'] = '<p class="comment-form-author-job comment-form-author">
      <label for="job">'. __('Your job') . '</label>
      <span class="required">*</span>
      <input id="job" name="job" value="'.$commenter['comment_author_job'].'" aria-required="true" size="30" type="text" />
      </p>';
 
      $sel_female = $sel_male = '';
      if ( $commenter['comment_author_gender'] != '') ${'sel_'.$commenter['comment_author_gender']} = ' checked="checked"';
 
      $default['fields']['gender'] = '<p class="comment-form-author-gender">
      <span class="label_like">'. __('Your gender') . '</span>
      <label for="female">F</label> <input '. $sel_female .' id="female" name="gender" value="female" type="radio" />
      <label for="male">M</label> <input '. $sel_male .' id="male" name="gender" value="male" type="radio" />
      </p>';
 
      // On retourne le tableau des champs
 
      return $default;
   }
}

Quelques explications s’imposent :
Concernant le HTML produit, je copie et adapte la structure par défaut de mon thème sur les champs de formulaire (ici TwentyEleven) dans le but de limiter les modifications futures sur la CSS (d’où la copie de la classe comment-form-author sur comment-form-author-job).

Le tableau des champs (fields) ressemble à cela :

array(
   'author' => '<p class="comment-form-author">…',
   'email'  => '<p class="comment-form-email">…',
   'url'    => '<p class="comment-form-url">…'
);

Pour ajouter un champ il me suffit donc de faire (en remplaçant « slug » par quelque chose de pertinent) :

$default['fields']['slug'] = '<p class="comment-form-author-slug">…';

La ligne 12 récupère les cookies enregistrés lorsque qu’un commentaire est posté par un utilisateur. Ils n’existent donc pas lorsqu’un visiteur n’a jamais commenté sur votre blog, mais permettent ensuite de pré-remplir les champs (ligne 26 et 30) si l’utilisateur revient poster un commentaire.
Nous verrons plus loin comment nous enregistrons les cookies pour nos nouveaux champs de formulaire.

À noter : Il existe le hook comment_form_defaults_fields qui permet de manipuler directement les champs (ex : unset($default['url']). Cependant j’ai une légère préférence pour le hook comment_form_defaults car il permet d’atteindre d’autres éléments du formulaire.
Par contre, si votre objectif est de supprimer simplement le champ url par exemple :

add_filter('comment_form_default_fields','juiz_remove_url_field');
if ( !function_exists('juiz_remove_url_field')) {
   function juiz_remove_url_field( $fields ) {
      unset($fields['url']); return $fields;
   }
}

Enregistrer les données des champs personnalisés

Cette seconde étape se découpe en deux sous-étapes si certains de vos champs sont obligatoires.
Le premier hook utilisé est comment_post qui permet d’intervenir lorsque le commentaire a été enregistré.
Le second est preprocess_comment qui intervient avant l’enregistrement des données en base, notamment pour les contrôler.

Nous allons donc d’abord contrôler notre champ obligatoire ‘job’ pour retourner une erreur s’il est vide :

add_filter( 'preprocess_comment', 'juiz_verify_comment_data' );
if ( !function_exists('juiz_verify_comment_data') ) {
   function juiz_verify_comment_data( $commentdata ) {
 
      // si job est vide on affiche une erreur
      if ( ! isset( $_POST['job'] ) )
         wp_die( __( 'Error: please fill the required field (job).' ) );
 
      // si job dépasse 45 caractères (arbitraire) on affiche une erreur
      elseif ( isset( $_POST['job'] ) AND strlen ( $_POST['job'] ) > 45 )
         wp_die( __( 'Error: 45 maximum char. for "job" field.' ) );
 
      return $commentdata;
   }
}

Une fois la donnée obligatoire contrôlée, nous enregistrons les données du commentaire :

add_action( 'comment_post', 'juiz_save_comment_data' );
if ( !function_exists('juiz_save_comment_data') ) {
   function juiz_save_comment_data( $comment_id ) {
 
      // définition de la durée de vie des cookies
      $comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
 
      if (isset($_POST['job'])) {
 
         // on enregistre l'info en base de données
         add_comment_meta( $comment_id, 'job', esc_html( $_POST['job'] ) );
 
         // on enregistre un cookie
         setcookie('comment_author_job_' . COOKIEHASH, esc_html( $_POST['job'] ), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
      }
 
      // on vérifie que le champ gender respecte les valeurs prévues
      if (isset($_POST['gender']) AND in_array ( $_POST['gender'] , array('male', 'female'))) {
         // même schéma que précédemment
         add_comment_meta( $comment_id, 'gender', esc_html($_POST['gender']) );
         setcookie('comment_author_gender_' . COOKIEHASH, esc_html( $_POST['gender']), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
      }
   }
}

Le cookie est optionnel mais il permet de reproduire le comportement de WordPress qui ajoute un cookie par champ du formulaire de commentaire pour se souvenir des données entrées par le visiteur.

En l’état, nous avons ajouté les infos en base de données, nous avons créé des cookies, et nous avons pris soin, dans l’étape précédente, de récupérer ces cookies grâce à la fonction wp_get_current_commenter(). Sauf qu’en fait cette fonction récupère uniquement les cookies pour les champs « classiques » (Nom, url, e-mail). Il faut donc compléter cette fonction pour l’inviter à piocher dans nos cookies fraichement créés :

add_filter('wp_get_current_commenter', 'juiz_add_custom_comment_cookies');
function juiz_add_custom_comment_cookies($cookies) {
 
	$comment_author_job = '';
	if ( isset($_COOKIE['comment_author_job_'.COOKIEHASH]) )
		$comment_author_job = $_COOKIE['comment_author_job_'.COOKIEHASH];
 
	$comment_author_gender = '';
	if ( isset($_COOKIE['comment_author_gender_'.COOKIEHASH]) )
		$comment_author_gender = $_COOKIE['comment_author_gender_'.COOKIEHASH];
 
 
	$cookies['comment_author_job'] = $comment_author_job;
	$cookies['comment_author_gender'] = $comment_author_gender;
 
	return $cookies;
}

La variable $cookies est un tableau associatif (clé + valeur), dont la clé est le nom du cookie (sans le _cookiehash) et la valeur est la valeur du cookie que l’on récupère s’il existe.

Maintenant il faut afficher ces informations dans notre liste de commentaire !

Afficher les données personnalisées dans la liste de commentaires

Cette dernière étape permet d’afficher les informations dans la liste de commentaires. Il existe un certain nombre de hooks qui permettent d’intervenir sur des zones précises d’un commentaire. Je vais en utiliser deux ici qui sont : get_comment_author_link et get_avatar.

Je souhaite afficher le job à côté du nom de l’auteur d’un commentaire.

add_filter( 'get_comment_author_link', 'juiz_attach_custom_info_to_comments_list' );
if ( !function_exists('juiz_attach_custom_info_to_comments_list') ) {
   function juiz_attach_custom_info_to_comments_list( $author ) {
 
      // on récupère l'info job
      $job = get_comment_meta( get_comment_ID(), 'job', true );
 
      // si l'info existe, on l'ajoute entre parenthèse après l'auteur
      if ( $job )
         $author .= ' (' . $job . ')';
 
      // on retourne l'info
      return $author;
   }
}

La variable $author contient le code HTML qui affiche le nom de l’auteur (avec ou sans lien vers son site). On ne fait donc que rajouter du contenu à la suite de cette chaine.
Cette technique a l’avantage d’ajouter l’information également dans le widget qui traite des derniers commentaires postés.

Pour afficher la valeur de gender, j’aurais très bien pu faire la même chose en ajoutant l’information à la suite après l’avoir récupérée avec get_comment_meta(). Mais comme j’aime bien me compliquer la vie, j’ai décidé d’ajouter une classe autour de l’avatar de l’utilisateur.

add_filter ( 'get_avatar', 'juiz_attach_custom_gender_to_avatar');
if ( !function_exists('juiz_attach_custom_gender_to_avatar') ) {
   function juiz_attach_custom_gender_to_avatar( $avatar ) {
 
      $gender = get_comment_meta( get_comment_ID(), 'gender', true );
      $gender = $gender ? $gender : 'undefined';
      $avatar = '<span class="gender ' . $gender . '">' . $avatar . '</span>';
 
      return $avatar;
   }
}

La variable $avatar contient le code HTML de l’avatar de l’utilisateur, une simple image par défaut. Ici on englobe l’avatar d’un élément span porteur du classe gender ainsi que d’une classe dynamique qui peut être male, female ou undefined en fonction de l’info que l’on récupère en base de données.

Le métier placé à côté du nom d'auteur, et l'avatar customisé avec un symbole en fonction du sexe.

Et voilà, c’est tout pour cette longue astuce, pour le reste c’est à vous d’imaginer.

Option bonux 1 : éditer un champ existant

En restant dans le premier hook (comment_form_defaults) il est possible d’éditer les champs existants en les manipulants avec des expressions régulières, ou en les réécrivant :

$default['fields']['author'] = '
   <p class="comment-form-author">
      <label for="author">'. __('Name') . '</label>
      <span class="required">*</span>
      <input id="author" name="author" value="'.$commenter['comment_author'].'" placeholder="Votre nom ou pseudo" aria-required="true" size="30" type="text" />
   </p>
';

Ici je rajouter un attribut placeholder par exemple.
Inutile de changer quoi que ce soit dans le traitement des données, WordPress le prévoit déjà.
Merci à Nicolas pour la suggestion.

Option bonux 2 : redirection après un commentaire

J’ai croisé dans le cœur de WordPress le hook comment_post_redirect qui permet de choisir la page de redirection lorsqu’un utilisateur a posté un commentaire.
Par défaut cette page redirige vers le commentaire de l’utilisateur avec une ancre.
Voici comment la fonction se présente :

add_action('comment_post_redirect', 'juiz_new_comment_redirection');
if ( !function_exists('juiz_new_comment_redirection') ) {
   function juiz_new_comment_redirection( $location ) {
      // valeur par défaut donnée par WordPress
      // à vous de personnaliser $location en fonction de vos besoins
      $location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
      return $location;
   }
}

Option bonux 3 : le code complet

Pour ceux qui ont peur d’avoir raté une étape :

// ajout physique d'un champ
add_filter( 'comment_form_defaults', 'juiz_manage_default_fields');
 
// $default contient tous les messages du formulaire de commentaire
// il contient également "comment_field", le textarea du message
if ( !function_exists('juiz_manage_default_fields')) {
	function juiz_manage_default_fields( $default ) {
 
		$commenter = wp_get_current_commenter();
 
		// Suppression d'un champ par défaut parmi : author, email, url
 
		//unset($default['fields']['url']);
 
		// Ajout des champs dans le tableau "fields"
 
		$default['fields']['job'] = '<p class="comment-form-job comment-form-author">
		<label for="job">'. __('Your job') . '</label>
		<span class="required">*</span>
		<input id="job" name="job" aria-required="true" size="30" type="text" value="' . esc_attr($commenter['comment_author_job']) . '" />
		</p>';
 
		$sel_female = $sel_male = '';
		if ( $commenter['comment_author_gender'] != '') ${'sel_' . $commenter['comment_author_gender']} = ' checked="checked"';
 
		$default['fields']['gender'] = '<p class="comment-form-gender">
		<span class="label_like">'. __('Your gender') . '</span>
		<label for="female">F</label> <input id="female" '. $sel_female .' name="gender" value="female" type="radio" />
		<label for="male">M</label> <input id="male" '. $sel_male .' name="gender" value="male" type="radio" />
		</p>';
 
		// On retourne le tableau des champs
 
		return $default;
	}
}
 
 
// controle des champs obligatoires à l'enregistrement
add_filter( 'preprocess_comment', 'juiz_verify_comment_data' );
if ( !function_exists('juiz_verify_comment_data') ) {
	function juiz_verify_comment_data( $commentdata ) {
 
		if ( ! isset( $_POST['job'] ) )
			wp_die( __( 'Error: please fill the required field (job).' ) );
		elseif ( isset( $_POST['job'] ) AND strlen ( $_POST['job'] ) > 45 )
			wp_die( __( 'Error: 45 maximum char. for "job" field.' ) );
 
		return $commentdata;
	}
}
 
//ajout en base de données des champs
add_action( 'comment_post', 'juiz_save_comment_data' );
if ( !function_exists('juiz_save_comment_data') ) {
	function juiz_save_comment_data( $comment_id ) {
 
		$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
 
		if (isset($_POST['job']) AND strlen ($_POST['job']) < 45) {
			add_comment_meta( $comment_id, 'job', esc_html( $_POST['job'] ) );
			setcookie('comment_author_job_' . COOKIEHASH, esc_html( $_POST['job'] ), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
		}
 
		if (isset($_POST['gender']) AND in_array ( $_POST['gender'] , array('male', 'female'))) {
			add_comment_meta( $comment_id, 'gender', esc_html($_POST['gender']) );
			setcookie('comment_author_gender_' . COOKIEHASH, esc_html( $_POST['gender']), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
		}
	}
}
 
 
// pour que get_commenter retourne nos cookies custom
add_filter('wp_get_current_commenter', 'juiz_add_custom_comment_cookies');
function juiz_add_custom_comment_cookies($cookies) {
 
	$comment_author_job = '';
	if ( isset($_COOKIE['comment_author_job_'.COOKIEHASH]) )
		$comment_author_job = $_COOKIE['comment_author_job_'.COOKIEHASH];
 
	$comment_author_gender = '';
	if ( isset($_COOKIE['comment_author_gender_'.COOKIEHASH]) )
		$comment_author_gender = $_COOKIE['comment_author_gender_'.COOKIEHASH];
 
	$cookies['comment_author_job'] = $comment_author_job;
	$cookies['comment_author_gender'] = $comment_author_gender;
 
	return $cookies;
}
 
 
// afficher l'info job dans la liste des commentaires
add_filter( 'get_comment_author_link', 'juiz_attach_custom_info_to_comments_list' );
if ( !function_exists('juiz_attach_custom_info_to_comments_list') ) {
	function juiz_attach_custom_info_to_comments_list( $author ) {
 
		$job = get_comment_meta( get_comment_ID(), 'job', true );
		if ( $job )
			$author .= ' (' . $job . ')';
 
		return $author;
	}
}
 
// afficher l'info gender graphiquement pas loin de l'avatar
add_filter ( 'get_avatar', 'juiz_attach_custom_gender_to_avatar');
if ( !function_exists('juiz_attach_custom_gender_to_avatar') ) {
	function juiz_attach_custom_gender_to_avatar( $avatar ) {
 
		$gender = get_comment_meta( get_comment_ID(), 'gender', true );
		$gender = $gender ? $gender : 'undefined';
			$avatar = '<span class="gender ' . $gender . '">' . $avatar . '</span>';
 
		return $avatar;
	}
}
 
// redirection personnalisée après un post de commentaire
add_action('comment_post_redirect', 'juiz_new_comment_redirection');
if ( !function_exists('juiz_new_comment_redirection') ) {
	function juiz_new_comment_redirection( $location ) {
		$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
		return $location;
	}
}

L’espace de commentaire et là pour vous ;)

64 commentaires et 4 trackbacks sur “WordPress – personnaliser les champs du formulaire de commentaire”

  1. Daniel dit :
    2 mai 2012

    Voici un beau tuto, particulièrement bien détaillé. Le fonctionnement du formulaire est finement désossé et permet de bien comprendre comment l’ensemble fonctionne. Récupération de l’existant, modification, sauvegarde et récupération des données, traitement des cookies, de nombreux aspects sont ici abordés, et on peut s’inspirer de leur traitement pour d’autres applications.

  2. Geoffrey dit :
    2 mai 2012

    Merci pour ces éloges :)

  3. Nicolas dit :
    3 mai 2012

    Merci beaucoup pour tes contributions de qualités au web francophone, ça fais super plaisir. Merci :)

  4. 4 mai 2012

    Super détaillé, merci beaucoup pour le tuto, ça va s’avérer utile.

  5. 5 mai 2012

    Wow, c’est ce que j’appelle un tutoriel de qualité, je garde ça sous le coude, merci ! :)

  6. Geoffrey dit :
    5 mai 2012

    Merci à vous ! :)

  7. yann dit :
    10 mai 2012

    Merci pour ce tuto, qui est très proche de ce que je cherche, mais n’y répond malheureusement pas :)

    Sur mon blog, j’aimerais proposer un commentaire par défaut que les visiteurs peuvent modifier a leur guise avant le de valider.

    par exemple, j’aimerais afficher un tableau de multiplication (en html) et les visiteurs devront le compléter avant de le valider ou simplement tout supprimer pour ecrire un commentaire classique.

  8. Geoffrey dit :
    10 mai 2012

    Bonjour Yann,

    Dans la première partie de l’article, je mentionne la possibilité d’atteindre d’autres éléments du formulaire. Le champ textarea du formulaire en fait partie, il est atteignable à travers :
    $default['comment_field']

    Du coup en ajoutant ce morceau de code dans la toute première fonction présentée, ça devrait répondre à vos besoins.

    $default['comment_field'] = '<p class="comment-form-comment">
    	<label for="comment">Commentaire</label>
    	<textarea id="comment" name="comment" cols="45" rows="8" aria-required="true">Le contenu par défaut du champs</textarea>
    </p>';

    Je donne souvent quelques pistes dans mes tutoriels qu’il vous appartient ensuite d’explorer pour aller plus loin :)

    Bonne continuation.

  9. yann dit :
    10 mai 2012

    Merci beaucoup pour votre « aide », enfin, la vous avez fait tout mon boulot :)

    Merci beaucoup, un site de plus ajouté a mes favoris :)

  10. Geoffrey dit :
    10 mai 2012

    Merci Yann.
    Au plaisir :)

  11. yann dit :
    10 mai 2012

    J’avoue être complétement perdu, j’utilise le thème Imbalance 2 avec WordPress MU, et impossible de mettre la main le moindre éléments, par exemple comment_form_defaults

  12. Geoffrey dit :
    10 mai 2012

    Comment tu as procédé ?

  13. yann dit :
    11 mai 2012

    Bonjour,

    J’ai finalement réussi a mettre en place un nouveau commentaire par défaut sous forme HTML, j’avais mal placé ton code au sein de la page fonctions.php.

    Pour info, j’ai du également rajouté le module CKEditor afin que mon code HTML soit affiché correctement dans le textarea.

    Merci encore.

  14. Geoffrey dit :
    11 mai 2012

    Hello,
    Merci pour l’info et bonne continuation :)

  15. lussiez dit :
    15 mai 2012

    Bonjour,
    Je me permets de laisser un commentaire sur ce sujet pour tenter de résoudre un problème sur mon blog car je vois que vous parler ici de sauvegarde des données.

    sur mon site des utilisateurs se plaignent de devoir réécrire à chaque fois leurs données dans les champs obligatoires tel que nom,e-mail,… de  » laisser un commentaire « .

    Dans réglage–discussion : J’ ai décoché la case  » l’ auteur d’ un commentaire doit renseigner son nom et son adresse de messagerie » mais cela ne règle pas mon problème.

    Me faut il utiliser une partie de votre code ou suis-je totalement hors-sujet.Je cherche une solution sur le net depuis un bon moment mais je ne trouve pas de solution.
    Merci par avance
    cordialement
    arnaud

  16. Geoffrey dit :
    15 mai 2012

    Bonjour,

    Il est possible que vos utilisateurs aient désactivé l’enregistrement des cookies, ou les effacent à chaque nouvelle session de navigation.
    Est-ce absolument systématique ? Avez-vous également le problème sur votre propre machine avec cookies activés ?

    Je sais également que les thèmes ElegantThemes utilisent des templates personnalisés des formulaires de commentaire, il est possible que cela influe sur le comportement du formulaire. Il faudrait que je regarde la composition de ce thème.

    Bonne fin de journée.

  17. lussiez dit :
    15 mai 2012

    Il me semble également qu’ il y a conflit avec le template d’ elegant.
    Merci pour ta réponse, je ne vais pas t’ ennuyer plus longtemps, je vais régler ça directement avec eux.
    merci encore.
    bye arnaud

  18. Benjamin dit :
    30 juin 2012

    Merci pour ce très bon tuto.
    Mais n’est-il pas possible de personnaliser complètement le formulaire ?
    Par exemple de pouvoir rajouter une class à la balise « form », pouvoir mettre un fieldset ou des div autour du bouton submit, ni même de mettre une class au bouton submit.

  19. Geoffrey dit :
    30 juin 2012

    Bonjour Benjamin,

    Il est possible de retravailler chacun des champs, donc de prévoir un fieldset par exemple, en jouant avec les premiers champs ainsi :

    
    $default['fields']['author'] = '<fieldset><legend>Vous :</legend>'. $default['fields']['author'];
    $default['fields']['url'] = $default['fields']['url']. '</fieldset>';
    

    Ici ça permet de placer un fieldset pour l’ensemble des champs author, e-mail et url.

    Pour la classe sur le formulaire je ne crois pas, mais il est possible de mettre une classe sur le parent du formulaire.
    Je n’ai pas trouvé pour le reste également.

    Bon week-end !

  20. Benjamin dit :
    30 juin 2012

    Ça reste de la bidouille mais ça marche. Merci pour ta réponse.
    Espérons que WordPress fasse une mise à jour rapidement de ce côté la pour le reste.

    Bon week-end à toi également.

  21. Geoffrey dit :
    1 juillet 2012

    Je ne pense pas que ce soit une des priorités de développement du cœur :)
    Je viens de revérifier dans le template du formulaire dans le cœur de WordPress, il n’y a rien de prévu pour les éditions que tu demandes.
    Bonne semaine !

  22. Benjamin dit :
    21 juillet 2012

    Pour info j’ai trouvé une alternative à mon problème. J’ai utilisé jQuery pour ajouter ma class. C’est un peu lourd juste pour une class mais ça marche.
    Merci encore pour t’es infos, et bonne semaine à toi également.

  23. émi dit :
    16 août 2012

    bonjour, j’aimerai savoir comment ajouter « laisser un commentaire » à coté de « 0 commentaires », j’ai essayé plusieurs modifications en vain. pouvez vous m’aider svp ?

  24. Geoffrey dit :
    16 août 2012

    Bonjour Émi,

    Dans ton thème Yoko tu as deux endroits où cette information apparaît :
    - le fichier content.php de ton thème (l’information se trouve ligne 16)
    - le fichier comments.php de ton thème (ligne 26)

    On dirait que tu as déjà essayé de modifier la ligne 26.
    Essaye de remplacer à partir de la ligne 25 par :

    <h3 id="comments-title"><?php
       printf( _n( 'One Comment', '%1$s Comments', get_comments_number(), 'yoko' ),
       number_format_i18n( get_comments_number() ));
       echo '- <a href="#respond" rel="nofollow">Laissez le vôtre</a>';
    ?></h3<

    Je ne sais pas exactement si c’est ça que tu recherches…

    Bon courage.

  25. émilie dit :
    16 août 2012

    merci beaucoup ! alors c’est déjà bien mais non je parle du lien sur lequel on clique juste quand on ne voit que l’article, à coté de la date de post de l’article etc et j’aurai voulu le placer en dessous de l’article comme sur skyrock blog. sauriez vous faire ça ?

  26. émilie dit :
    16 août 2012

    y a t’il aussi moyen de retirer tous ces « yoko elmastudio » et compagnie ?

  27. Geoffrey dit :
    16 août 2012

    Hello,

    Je te réponds oui dans les deux cas mais je ne pourrai t’expliquer que demain seulement, je n’ai pas accès aux fichiers d’où je poste.
    Bonne soirée.

  28. émilie dit :
    16 août 2012

    pas de problème ! merci j’attends c’est déjà très bien :)

  29. Geoffrey dit :
    21 août 2012

    Hello,

    Désolé pour le retard, beaucoup de taff en ce moment.

    Pour la mention de l’auteur, saches que l’auteur apprécie toujours un petit lien quelque part sur ton site. Si tu le retires du footer, je t’invite à le mettre dans une page du genre « mentions légales » ou « à propos ».
    Il faut éditer le fichier footer.php en remplaçant :

    Proudly powered by <a href="http://wordpress.org/">WordPress</a><span class="sep"> | </span><?php printf( __( 'Theme: %1$s by %2$s', 'yoko' ), 'Yoko', '<a href="http://www.elmastudio.de/wordpress-themes/">Elmastudio</a>' ); ?>

    par

    Fièrement propulsé par <a href="http://wordpress.org/">WordPress</a>

    Concernant l’affichage du petit lien qui invite à commenter, ça se passe dans content-single.php, à la ligne où tu vois ça :

    <?php comments_popup_link( __( '0 comments', 'yoko' ), __( '1 Comment', 'yoko' ), __( '% Comments', 'yoko' ) ); ?>

    juste après, rajoute ça :

     - <a href="#comments">Laisser un commentaire</a>

    Normalement ça devrait le faire.
    Bon courage ;)

  30. émilie dit :
    23 août 2012

    Bonsoir, merci beaucoup encore une fois ! pour le « laisser un commentaire » il faut avoir cliqué indépendamment sur l’article. moi j’aurai aimé juste en ayant cliqué sur « accueil » là ou il y a mes articles en avant et les récents le voir aussi « laisser un commentaire ». est ce que vous voyez ce que je veux dire ? désolée encore de vous embeter je suis exigeante !
    merci d’avance.

  31. émilie dit :
    23 août 2012

    pour l’auteur je l’ai mis dans le premier article

  32. Geoffrey dit :
    24 août 2012

    Merci pour l’auteur :)

    Pour insérer le lien vers le formulaire de commentaire d’un article depuis la liste de la page d’accueil, il faut que tu modifies le fichier content.php, ligne 16, remplace :

    <?php comments_popup_link( __( '0 comments', 'yoko' ), __( '1 Comment', 'yoko' ), __( '% Comments', 'yoko' ) ); ?></p>

    par

    <?php comments_popup_link( __( '0 comments', 'yoko' ), __( '1 Comment', 'yoko' ), __( '% Comments', 'yoko' ) ); ?><br /><a href="<?php the_permalink(); ?>#respond">Laisser un commentaire</a></p>

    Voilà voilà :)
    Puis si jamais tu utilises les autres types d’articles (liens, vidéos, etc.), tu devras peut-être aussi trouver les parties de code ressemblant dans les différents fichiers content-*.php.

    Bonne journée.

  33. 31 août 2012

    Très bon ce tuto ! grand merci. Je savais rajouter un champ pour twitter, grâce au tuto de grafikart. Mais là les checkbox, c’est top, ca me donne des idées ;)

  34. Quentin dit :
    5 septembre 2012

    Bonjour Geoffrey,

    J’avoue être complètement perdu. J’utilise le theme Yoko.

    Ma premiére question est : Quel est le fichier fonction.php que l’on doit modifier??? Celui du théme ou l’initial de WP.

    Ma seconde question est : Quels bouts de code dois-je supprimer dans ma page fonction.php? Y a t’il un code initial à supprimer?

    Troisiéme question : Lorque je colle juste le code en bout de la page fonction.php du thème j’ai les mêmes entrées du formulaire suivis des nouvelles entrées non codées avec le même CSS.

    Je suis désolé j’ai bien conscience que je suis en dessous du niveau

  35. Geoffrey dit :
    6 septembre 2012

    Bonjour Quentin,

    Ce n’est pas une question de niveau, il est fort probable que, par habitude du fonctionnement de WordPress, je ne sois pas suffisamment précis dans mes propos.

    Lorsqu’on modifie une partie du fonctionnement de WordPress, on passe soit par un plugin, soit par un thème. Je ne vous demanderai jamais de modifier le cœur du CMS.
    Donc oui il s’agit bien de modifier le fichier functions.php du thème Yoko (wp-content/themes/yoko/).

    Il n’y a pas vraiment de morceau de code à supprimer, tout dépend de ce que tu souhaites obtenir au final en fait.

    Dans le premier code que je fournis (qui est une fonction à prendre en l’état), je présente deux choses, la suppression d’un des champs existant :

    // Suppression d'un champ par défaut parmi : author, email, url
    unset ( $default['fields']['url'] );
    

    Et l’ajout d’un champ :

    // Ajout des champs dans le tableau "fields"
          // $commenter[] contient les infos sur le visiteur
          $default['fields']['job'] = '<p class="comment-form-author-job comment-form-author">
          <label for="job">'. __('Your job') . '</label>
          <span class="required">*</span>
          <input id="job" name="job" value="'.$commenter['comment_author_job'].'" aria-required="true" size="30" type="text" />
          </p>';

    L’ajout permet de placer des nouveaux champs à la suite des anciens (entre les champs existant et le champs de texte « commentaire »).

    C’est ici qu’il faut composer le code HTML en calquant celui de ton thème Yoko afin que les styles du thème soient appliqués. Si malgré la copie de la structure HTML, les champs n’ont pas les bons styles, il te faudra utiliser un peu de CSS (en modifiant style.css).

    Bonne journée.

  36. Naïa dit :
    26 septembre 2012

    Intéressant. Je n’ai pas lu dans le détail mais même moi qui suis plus que novice en php et code, j’ai l’impression que le tutoriel est à ma portée. Je ne manquerai pas de m’y repencher dès que j’aurai un peu plus de temps. Merci.

  37. Geoffrey dit :
    26 septembre 2012

    Merci.
    Si tu as des retours à faire au moment où tu te pencheras plus en détail sur son étude, je suis à l’écoute ;)
    Bonne soirée.

  38. Naïa dit :
    26 septembre 2012

    Je n’y manquerai pas. Ca ne devrait plus tellement tarder (le projet dont il est question est un projet « pur plaisir », ce qui ne le met pas en priorité malheureusement).

    J’espère que la réponse n’est pas déjà dans le texte (il ne me semble pas après avoir lu en diagonale) mais qu’en est-il des anciens commentaires (sur un blog pré-existant) lorsqu’on modifie le formulaire de commentaire en ajoutant une valeur obligatoire ? Par exemple, mettons que j’ajoute le genre en obligatoire. Les commentaires déjà présent n’ont pas cette information.

  39. Geoffrey dit :
    26 septembre 2012

    Normalement ça ne pose pas de problème puisque dans mes tests j’avais ajouté les différents champs un par un et plusieurs « versions » de commentaires cohabitaient.

    Donc ça devrait aller. :)

  40. Naïa dit :
    26 septembre 2012

    Je te remercie pour cette réponse. Reste à lire le détail pour moi donc ;) .

  41. charly dit :
    26 septembre 2012

    bonjour Geoffrey ,
    merci pour ce tuto c’est exactement ce que je cherchais par contre je cherche aussi intégrer une liste déroulante dans un des champs et je n’y parviens pas…

    cordialement
    charly

  42. Geoffrey dit :
    27 septembre 2012

    Bonjour Charly,

    Logiquement ça doit fonctionner de la même manière que pour le reste, il suffit de rajouter le champ comme pour « job » dans la première fonction :

    $default['fields']['activity'] = '<p class="comment-form-author-activity comment-form-author">
              <label for="activity">'. __('Your activity') . '</label>
              <span class="required">*</span>
              <select id="activity" name="activity" aria-required="true">
                        <option value="Designer">Designer</option>
                        <option value="Développeur">Développeur</option>
                        <option value="Intégrateur">Intégrateur</option>
              </select>
    </p>';

    Ensuite il est possible d’enregistrer et récupérer cette valeur de la même manière que les autres, en suivant l’exemple de « job » il suffira de remplacer « job » par « activity » si on en reste au code que je te propose ici.

    Bon courage :)

  43. charly dit :
    27 septembre 2012

    Merci pour tout ça Geoffrey ,
    j’avais fait une erreur de guillemet au niveau de la value…j’ai un peu honte ;)

    bonne soirée

  44. salima dit :
    31 octobre 2012

    Félicitation,

    Un très joli bon site

  45. dounia dit :
    16 novembre 2012

    Merci bcp Geoffrey…ça marche super bien..:)….

  46. housni dit :
    24 novembre 2012

    merci votre message ma beaucoup aidez

  47. fender dit :
    27 novembre 2012

    bonjour,
    comment faire pour enlever totalement le champ « commentaires » (la possibilité de laisser des commentaires et donc avoir 1 site qui est juste 1 portfolio)?
    merci pour votre réponse.

  48. Geoffrey dit :
    27 novembre 2012

    Bonjour,
    Cela se passe dans le menu Réglages > Discussion > « Autoriser les visiteurs à publier des commentaires sur les derniers articles » > Décocher.
    Bonne journée :)

  49. fender dit :
    27 novembre 2012

    Bonjour, ça n’a pas fonctionné en décochant. Mais j’ai trouvé 1 solution en rajoutant (style= »display : none ») dans loop-single.php.
    Par contre, je cherche aussi à agencer les galeries dans les posts. Les vignettes sont présentées en vertical avec de la marge avec 1 marge, et je voudrais les présenter en horizontal. exemple sur mon site > http://www.patfender.com/photos/masters-13-de-golf/
    Je cherche dans le css mais je ne trouve pas. Auriez-vous 1 solution?
    Merci

  50. Geoffrey dit :
    27 novembre 2012

    Bonjour,

    Cela fonctionne forcément, c’est probablement parce que le contenu était existant avant la désactivation de cette option (l’indice est dans l’intitulé de l’option ;) ).
    Pour désactiver les commentaires sur les contenus (pages et articles) déjà publiés, il faut éditer le post concerné et décocher la case dans « discussion ».

    Concernant votre problème de mise en page, vous comprendrez que je ne peux pas proposer un service de débogage à tous mes lecteurs. La création de template WordPress est un travail : Studio Web. Mais la solution se trouve sur ce blog (recherche : « display inline-block »).

    Merci.

  51. Olivier C dit :
    28 novembre 2012

    Bonjour Geoffrey,

    A tout hasard : Connaissez-vous une soluce sans plugins pour stocker les données d’un formulaire dans la base de donnée ?

    Je crois que le salut vient de $wpdb, mais pour maitriser ce truc propriétaire, j’en bave un peu (je trouve plus simple de maitriser le standard PDO, mais ce n’est pas compatible avec WP). Comme plugins, il existe une extension pour Contact Form 7 : « Contact Form 7 to Database Extension », mais ce n’est pas mon but…

  52. Geoffrey dit :
    29 novembre 2012

    Bonsoir Olivier,
    Tu peux me tutoyer tu sais :)

    Je ne connais pas d’autre technique que l’utilisation de la classe wpdb. Elle n’est pas si complexe que cela (pourtant je ne suis pas développeur) et est plutôt bien documentée : http://codex.wordpress.org/Class_Reference/wpdb

    Elle permet de se greffer en toute sécurité sur les noms variables des tables de la base de données.
    Bon courage :)

  53. Olivier C dit :
    29 novembre 2012

    Bon, et bien je n’ai plus qu’à m’y coller!

  54. Nico dit :
    3 février 2013

    Merci beaucoup pour ce tuto exhaustif. Il existe une multitude de plugins wordpress qui gèrent les formulaires personnalisés aujourd’hui, mais je rechignais à m’embarquer dans une usine à gaz (configuration front+back avec des lignes de code pas toujours « vérifiables »).

    Ton article va me permettre de le faire DIY-style !

  55. newt93 dit :
    6 février 2013

    Bonjour,
    il y a là toutes les réponses aux questions que je me pose et plus encore traitées avec brio !!!
    mais , débutant , je ne trouve pas dans fonction.php la partie à modifier.
    je souhaite supprimer la demande ‘email’
    mais rien à faire je ne sais que fichier éditer je suis sous le dernier wordpress
    Merci très fort

  56. Geoffrey dit :
    7 février 2013

    Bonjour,
    Vous pouvez facilement trouver la réponse à cette question dans les commentaires plus au du vôtre.
    Indice : Il faut utiliser la fonction unset(); sur le bon champ.

  57. newt93 dit :
    7 février 2013

    Merci
    enfin résolu grâce à vous !!!!
    mon second but est de « figer » la page d’accueil pour mes ! écrits et de supprimer
    le lien « déposer un commentaire »
    qu ‘il n’apparaisse plus sur cette page .
    Merci

  58. Geoffrey dit :
    8 février 2013

    Je pense que ça va désormais se passer dans les fichiers PHP de ton thème, au niveau des boucles.
    Bon courage ;)

  59. Bus Ratp dit :
    18 février 2013

    A propos de « Il commence à dater, lisez-le donc en gardant son âge en tête ! » est bien sache que ton article restera jeune car il est fait soigneusement on voit qu’il y a du travail derrière et beaucoup de motivation. je reviendrait dans 3 ans ;-)

  60. Geoffrey dit :
    19 février 2013

    Merci du compliment :)
    Disons que j’essaye de maintenir les astuces à jour, et si ça ne fonctionnait plus, j’espère que les lecteurs sauront y apporter contribution, au moins en me le mentionnant.
    Au plaisir.

  61. Zigzagonal dit :
    15 avril 2013

    Bonsoir,

    Félicitations pour ton tuto, remarquable ! Tout ce que j’aime. J’ai pu l’adapter sans problème à mes propres besoins et ça marche très bien. Merci !

    Mais j’ai quelques questions cependant :

    1/ Les champs ajoutés au tableau $default apparaissent dans le cas d’un contributeur non connecté au site. Comment procéder pour que des champs restent dispo dans le cas d’un utilisateur connecté au site ?

    2/ Comment procéder aussi pour permettre une modification a posteriori d’une métadonnée ? Car là encore, quand on modifie depuis l’interface d’admin un commentaire, les métadonnées ajoutées sont absentes…

    Merci par avance

  62. Zigzagonal dit :
    16 avril 2013

    Bonjour,

    Je pense avoir trouvé une première réponse.

    Les actions comment_form_logged_in_after et comment_form_after_fields semblent ajouter des champs pour respectivement les utilisateurs déjà connectés et les utilisateurs non connectés.

    Elles devraient donc permettre de compléter comment_form_defaults pour ajouter des champs selon les circonstances.

    Je vais tester ça.

  63. Geoffrey dit :
    17 avril 2013

    D’acc, tu nous tiendras au courant ?
    Thanks.

  64. Bus Ratp dit :
    8 mai 2013

    Merci beaucoup Geoffrey…ça marche super bien.

Laisser un commentaire

Certains codes HTML ne sont pas échappés automatiquement. Pour afficher du code dans votre commentaire, merci d'échapper vos chevrons en utilisant "&lt;" et "&gt;" en lieu et place de "<"" et ">".

Il est difficile de proposer un support pour tous les articles de ce blog. En ne fournissant pas un moyen de consulter votre code bogué, vous vous assurez de ne pas avoir de réponse adaptée.

Les sites qui en parlent

 
Le studio web