« Encore un cours à recréer de zéro, avec ses douze leçons dans le bon ordre. » Ce commentaire, glissé par un formateur d’une plateforme e-learning après avoir passé une matinée entière à reconstruire un cours similaire à un précédent, a justifié le développement d’un bouton de duplication complète, capable de copier un cours et l’intégralité de ses leçons enfants en une seule opération.
La duplication générique d’un article, déjà traitée par ailleurs pour des contenus simples, ne suffisait pas ici : un cours de ce type est un article personnalisé de type cours, relié à plusieurs articles enfants de type lecon via le champ natif post_parent. Copier uniquement le cours sans ses leçons aurait produit une coquille vide, inutile pour le formateur.
Ajouter le lien de duplication à la liste des cours
Le filtre post_row_actions permet d’ajouter un lien personnalisé sous chaque ligne de la liste d’administration, à côté des liens natifs « Modifier » et « Corbeille ». Ce lien pointe vers une action personnalisée sécurisée par un nonce.
add_filter( 'post_row_actions', 'elearn_ajouter_lien_duplication', 10, 2 );
function elearn_ajouter_lien_duplication( $actions, $post ) {
if ( 'cours' !== $post->post_type ) {
return $actions;
}
$url = wp_nonce_url(
admin_url( 'admin-post.php?action=elearn_dupliquer_cours&cours_id=' . $post->ID ),
'elearn_dupliquer_' . $post->ID
);
$actions['dupliquer_cours'] = '<a href="' . esc_url( $url ) . '">Dupliquer avec les leçons</a>';
return $actions;
}
Copier le cours puis chaque leçon enfant
La fonction de traitement récupère d’abord le cours d’origine, crée sa copie avec wp_insert_post(), puis parcourt les leçons enfants via get_children() pour recréer chacune d’entre elles en la rattachant au nouveau cours plutôt qu’à l’ancien.
add_action( 'admin_post_elearn_dupliquer_cours', 'elearn_traiter_duplication_cours' );
function elearn_traiter_duplication_cours() {
$cours_id = (int) $_GET['cours_id'];
check_admin_referer( 'elearn_dupliquer_' . $cours_id );
$cours_original = get_post( $cours_id );
$nouveau_cours_id = wp_insert_post( array(
'post_type' => 'cours',
'post_title' => $cours_original->post_title . ' (copie)',
'post_status' => 'draft',
'post_content'=> $cours_original->post_content,
) );
$lecons = get_children( array(
'post_parent' => $cours_id,
'post_type' => 'lecon',
'numberposts' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
) );
foreach ( $lecons as $lecon ) {
wp_insert_post( array(
'post_type' => 'lecon',
'post_parent' => $nouveau_cours_id,
'post_title' => $lecon->post_title,
'post_status' => 'draft',
'post_content'=> $lecon->post_content,
'menu_order' => $lecon->menu_order,
) );
}
wp_safe_redirect( admin_url( 'edit.php?post_type=cours&duplique=1' ) );
exit;
}

Ce qui ne doit surtout pas être copié
Un cours dupliqué ne doit jamais hériter des métadonnées de progression des apprenants inscrits au cours original : nombre d’inscrits, taux de complétion, ou avis laissés par les élèves. Ces données appartiennent au cours d’origine et n’ont aucun sens sur une copie qui n’a encore accueilli personne.
- Le nouveau cours démarre systématiquement en statut brouillon, jamais publié directement.
- Les métadonnées de progression, d’inscription et d’avis ne sont jamais recopiées, seulement le contenu pédagogique.
- L’ordre des leçons (
menu_order) est préservé pour que la copie reste immédiatement cohérente.
Gérer les médias associés aux leçons
Chaque leçon pouvait contenir des vidéos ou des documents attachés via la médiathèque. Plutôt que de dupliquer physiquement ces fichiers, ce qui aurait doublé l’espace de stockage inutilement, la copie réutilise les mêmes identifiants de médias, puisque le contenu pédagogique reste identique entre les deux versions du cours.
En résumé
Dupliquer un contenu hiérarchique complet demande de traiter explicitement la relation parent-enfant, ce qu’une duplication générique d’article ne gère jamais par défaut. Le principe développé ici pour un cours et ses leçons s’applique identiquement à toute structure similaire : un produit et ses variantes, un événement et ses sessions, ou un guide et ses chapitres. La vigilance porte surtout sur les données qui ne doivent jamais être recopiées, faute de quoi la copie hérite d’un historique qui ne lui appartient pas.