Le WordPress d'aujourd'hui, décodé pour les développeurs

Astuces

Un raccourci pour dupliquer un cours e-learning complet avec ses leçons

Copier un cours et l'ensemble de ses leçons enfants en une seule action, pour un client e-learning qui recyclait sans cesse ses formations existantes.

Par WordPress Développement • 28 septembre 2021 • 4 min de lecture • Aucun commentaire
Un raccourci pour dupliquer un cours e-learning complet avec ses leçons

« 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;
}
L'essentiel à retenir : La duplication générique d'un article ne suffit pas quand des contenus enfants existent ; wp_insert_post renvoie l'identifiant nécessaire pour recréer chaque leçon ; Les métadonnées de progression ne doivent jamais être copiées avec le cours

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi