Cinq témoignages, une note sur cinq étoiles, un nom et une fonction : voilà tout le contenu qu’un client artisan souhaitait afficher sur sa page d’accueil, sans jamais dépasser cette quantité. Installer un plugin de témoignages complet, avec son propre post type, ses shortcodes et ses réglages d’affichage, aurait représenté une dépendance disproportionnée pour un besoin aussi borné.
Le contrôle Repeater, intégré nativement à l’API des widgets Elementor, permet de construire exactement ce type de liste directement dans le panneau de configuration d’un widget personnalisé, sans recourir à un post type séparé ni à une extension tierce.
La déclaration du contrôle Repeater
Un Repeater se déclare dans la méthode register_controls() du widget, en définissant d’abord les champs internes de chaque ligne avant de les rattacher au contrôle principal via Repeater, une classe fournie par l’API d’Elementor.
use Elementor\Repeater;
protected function register_controls() {
$repeater = new Repeater();
$repeater->add_control(
'nom',
array(
'label' => 'Nom du client',
'type' => \Elementor\Controls_Manager::TEXT,
)
);
$repeater->add_control(
'texte',
array(
'label' => 'Témoignage',
'type' => \Elementor\Controls_Manager::TEXTAREA,
)
);
$repeater->add_control(
'note',
array(
'label' => 'Note sur 5',
'type' => \Elementor\Controls_Manager::NUMBER,
'min' => 1,
'max' => 5,
'default' => 5,
)
);
$this->add_control(
'temoignages',
array(
'label' => 'Liste des témoignages',
'type' => \Elementor\Controls_Manager::REPEATER,
'fields' => $repeater->get_controls(),
'title_field' => '{{{ nom }}}',
)
);
}
Le rendu de la liste dans le widget

La méthode render() parcourt ensuite le tableau des lignes, disponible via les réglages du widget, pour générer le HTML final. Chaque ligne du Repeater arrive sous forme de tableau associatif reprenant les identifiants déclarés plus haut.
protected function render() {
$settings = $this->get_settings_for_display();
echo '<ul class="wpm-temoignages">';
foreach ( $settings['temoignages'] as $item ) {
printf(
'<li><strong>%s</strong> (%d/5) — %s</li>',
esc_html( $item['nom'] ),
(int) $item['note'],
esc_html( $item['texte'] )
);
}
echo '</ul>';
}
L’échappement systématique via esc_html() reste indispensable, même pour un contenu saisi uniquement par l’équipe éditoriale : de bonnes pratiques de sécurité s’appliquent indépendamment de la confiance accordée à l’auteur du contenu.
Pourquoi cette approche convient à ce cas précis
Le Repeater se montre particulièrement adapté quand trois conditions sont réunies : le nombre de lignes reste limité (une dizaine au grand maximum), le contenu ne nécessite pas de page dédiée par élément, et l’équipe éditoriale préfère gérer cette liste directement depuis le panneau du widget plutôt que depuis une liste de contenus séparée dans l’administration.
- Aucun post type additionnel à créer ni à maintenir.
- L’ordre des témoignages se règle simplement en glissant les lignes dans le panneau.
- La suppression d’un témoignage se fait en un clic, sans risque de contenu orphelin ailleurs sur le site.
Le Repeater convient à une liste courte et stable ; au-delà d’une trentaine d’éléments, un post type dédié redevient le choix le plus sain pour l’éditeur comme pour les performances.
Notre verdict
Pour cinq témoignages fixes affichés sur une seule page d’accueil, le Repeater a rempli parfaitement son rôle, avec un temps de développement limité à une trentaine de minutes et une prise en main immédiate par l’équipe éditoriale du client. Cette solution reste à réserver aux listes courtes ; les cas d’usage plus ambitieux appellent une architecture différente, hors du périmètre de cet article.