J’en parlais déjà il y a 3 ans en arrière, en expliquant comment personnaliser les champs de formulaire de commentaire, et je reviens sur le sujet car je me rends compte après quelques commentaires de lecteurs que je n’avais pas expliqué comment afficher ces informations dans l’espace d’administration. Voyons cela ensemble.

Si jamais vous n’avez pas suivi l’article de personnalisation des champs de formulaire de commentaire, je vous invite à y aller, car ce présent article est sa suite logique, même s’il peut être compris sans cette précédente lecture.

Créer une metabox pour les commentaires

WordPress permet de créer des petites boîtes un peu partout dans l’espace d’administration grâce à la fonction add_meta_box. Il suffit ensuite de déterminer l’emplacement de cette boîte et son contenu. Commençons par créer la fonction qui va créer notre boîte.

Comme d’habitude ce petit bout de code se place dans le fichier functions.php de votre thème, ou dans un plugin si vous vous sentez d’attaque :p

<?php
// on check si la fonction n'existe pas
if ( !function_exists('juiz_add_meta_boxes_in_comments') ) {

	// on créé la fonction d'ajout de notre metabox
	function juiz_add_meta_boxes_in_comments() {

		// vive le codex : http://codex.wordpress.org/Function_Reference/add_meta_box
		add_meta_box(
			'juiz_comment_extra_box',
			'Extra Informations',
			'juiz_metabox_for_comments',
			'comment',
			'normal'
		);
	}

	// on branche notre nouvelle box sur le bon hook
	add_action( 'add_meta_boxes', 'juiz_add_meta_boxes_in_comments' );
}
?>

Cette fonction seule ne peut pas fonctionner, il faut que nous créions également la fonction juiz_metabox_for_comments, comme le précise notre appel à la fonction add_meta_box (ligne 12 du code précédent).

Le contenu de la metabox

C’est cette fonction qui va créer le contenu de notre metabox. Pour ce contenu, je vais simplement copier le code HTML de la boîte des informations d’un commentaire classique dans l’admin de WordPress. Attention, c’est du tableau :p

<?php
// on check si la fonction n'existe pas
if ( !function_exists('juiz_metabox_for_comments')) {

	// on créé la fonction de contenu de notre boîte
	function juiz_metabox_for_comments($comment) {

		// on récupère nos données personnalisée
		// http://codex.wordpress.org/Function_Reference/get_comment_meta
		$my_meta_comment = get_comment_meta($comment->comment_ID, 'my_meta_comment', true);

		// On affiche notre tableau avec quelques données
		// prédéfinies, et notre donnée perso
		echo '<table class="form-table editcomment">
			<tr>
				<td class="first"><label for="my_meta_comment">My comment meta</label></td>
				<td><input type="text" id="my_meta_comment" name="my_meta_comment" value="'.$my_meta_comment.'"></td>
			</tr>
			<tr>
				<td class="first"><label for="juiz_user_id">User ID</label></td>
				<td><input type="text" id="juiz_user_id" name="juiz_user_id" value="'.$comment->user_id.'"></td>
			</tr>
			<tr>
				<td class="first">Article</td>
				<td><a href="'.get_the_permalink($comment->comment_post_ID).'">'.get_the_title($comment->comment_post_ID).'</a> <em>(<a href="'.get_edit_post_link($comment->comment_post_ID).'">'.__('Edit').'</a>)</em></td>
			</tr>
			<tr>
				<td class="first">User Agent</td>
				<td>'.$comment->comment_agent.'</td>
			</tr>
		</table>';
	}
}
?>

Comme vous pouvez le voir, je récupère quelques données existantes par défaut pour chaque commentaire, mais je récupère également mon champ personnalisé qui a précédemment été enregistré en tant que « comment meta ».

Les champs ajoutés dans l'espace d'admin

J’affiche d’ailleurs cette information dans un champ de formulaire, car je vais vous montrer comment permettre son édition depuis l’espace d’administration.

Enregistrer les données d’une metabox

Metabox créée, données récupérées, maintenant il faut sauvegarder cette donnée si un administrateur édite le contenu d’un commentaire (si jamais celui-ci est inapproprié par exemple).

Pour ce faire nous allons nous brancher sur le hook comment_save_pre. Je n’en ai pas trouvé d’autre pour effectuer ce travail, mais je ne suis pas expert en cœur de WordPress. Peut-être y en a-t-il un plus efficace. Celui-ci fait bien le travail toujours.

<?php
// on vérifie que la fonction n'existe pas déjà
if ( !function_exists('juiz_save_comment_datas')) {

	function juiz_save_comment_datas($comment_content) {

		// on va utiliser les infos de la base de données
		// http://codex.wordpress.org/Class_Reference/wpdb
		global $wpdb;

		$comment_ID = absint( $_POST['comment_ID'] );

		// si mon champ custom existe, je mets à jour sa valeur
		if ( isset( $_POST['my_meta_comment'] ) ) {
			// je nettoie la donnée avant...
			$my_meta_comment = sanitize_text_field( $_POST['my_meta_comment'] );
			// ... de la sauvegarder
			update_comment_meta( $comment_ID, 'my_meta_comment', $my_meta_comment );
		}

		// Technique extraite de wp_update_comment
		// Mise à jour des données existantes
		if ( isset( $_POST['juiz_user_id'] ) ) {
			// récupération de l'ID
			$user_id = absint($_POST['juiz_user_id']);
			$data = compact('user_id');
			// mise à jour de la valeur de comment_ID
			$rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) );
		}

		// on retourne $comment_content (nécessaire pour ce hook)
		return $comment_content;
	}
	
	// on ajouté la fonction au hook comment_save_pre
	add_filter('comment_save_pre', 'juiz_save_comment_datas' );
}
?>

Beaucoup de commentaires mais peu de code au final 🙂
Je ne sais pas précisément pourquoi vous souhaiteriez pouvoir éditer l’identifiant de l’utilisateur qui a posté ce commentaire, mais je donne l’exemple surtout à titre de démonstration de la méthode.
La première portion vous montre comment mettre à jour votre donnée personnalisée, la seconde comment mettre à jour une donnée déjà existante pour un commentaire. Pour avoir la liste des données existantes, je vous invite à lire la page : Codex get_comment

Bon courage !

Sommaire

  1. WordPress – Personnaliser les champs du formulaire de commentaire
  2. WordPress – Des champs personnalisés dans l’administration des commentaires