Dupliquer une page ou un article WordPress sans plugin est une opération courante que WordPress ne propose pas nativement dans son interface. Pourtant, quatre méthodes suffisent : copier-coller dans Gutenberg, un hook wp_insert_post() dans functions.php, WP-CLI en une ligne, ou l’API REST WordPress via curl. Aucune ne nécessite d’extension tierce. Cet article détaille chaque approche avec le code prêt à l’emploi, les précautions SEO et les cas où un plugin reste justifié.

Pourquoi WordPress ne propose pas de duplication native

WordPress gère les contenus via la table wp_posts. Chaque article ou page possède un ID unique, un post_status, un post_parent et une série de métadonnées dans wp_postmeta. Dupliquer un post revient à créer une nouvelle ligne dans wp_posts avec les mêmes champs, puis copier toutes les métadonnées associées.

WordPress Core a délibérément laissé cette fonctionnalité hors du noyau pour ne pas imposer de comportement par défaut sur le statut du duplicata (brouillon ou publié ?), le titre (suffixe automatique ou non ?), les termes de taxonomie, les images à la une et les métadonnées SEO. Ces choix dépendent du projet. C’est pourquoi des plugins comme Duplicate Post (800 000 installations actives) ou Yoast Duplicate Post existent, mais quatre approches sans code tiers couvrent 95 % des besoins.

Méthode 1 : copier-coller dans l’éditeur Gutenberg

La méthode la plus rapide ne nécessite ni code ni terminal. Elle convient pour dupliquer un article ou une page de façon ponctuelle.

Ouvrez la page ou l’article à dupliquer dans Gutenberg. Sélectionnez tous les blocs avec Ctrl+A (Windows/Linux) ou Cmd+A (Mac). Copiez avec Ctrl+C ou Cmd+C. Créez ensuite une nouvelle page ou un nouvel article via le menu Articles ou Pages, puis collez avec Ctrl+V.

Gutenberg colle la structure complète des blocs, y compris les colonnes, les groupes et les blocs personnalisés. Vous obtenez un brouillon fidèle que vous pouvez renommer et personnaliser avant publication.

Limites de cette méthode : l’image à la une n’est pas copiée. Les métadonnées Rank Math (focus keyword, méta-description) non plus. Il faut les renseigner manuellement. Pour les templates de page assignés dans le panneau latéral droit, vérifiez qu’il correspond bien au contexte du duplicata.

Cette méthode devient fastidieuse si vous devez dupliquer dix pages ou plus. Dans ce cas, préférez une des méthodes suivantes.

Méthode 2 : dupliquer via functions.php (hook save_post)

Ajouter une action dans functions.php ou dans un mu-plugin permet d’ajouter un lien « Dupliquer » directement dans la liste des articles ou des pages de l’administration WordPress. C’est la méthode la plus propre pour un usage répété sans plugin tiers.

Copiez le code suivant dans wp-content/themes/votre-theme/functions.php ou, de préférence, dans un fichier dédié wp-content/mu-plugins/wpal-duplicate-post.php (un mu-plugin s’active automatiquement et survit aux changements de thème) :

<?php
/**
 * Ajoute un lien "Dupliquer" dans la liste des articles et pages.
 * Déclenche la copie via une requête GET sécurisée par nonce.
 */
function wpal_duplicate_post_link( $actions, $post ) {
    if ( 'publish' !== $post->post_status && 'draft' !== $post->post_status ) {
        return $actions;
    }
    if ( ! current_user_can( 'edit_posts' ) ) {
        return $actions;
    }
    $url = wp_nonce_url(
        admin_url( 'admin.php?action=wpal_duplicate_post&post_id=' . $post->ID ),
        'wpal_duplicate_' . $post->ID
    );
    $actions['duplicate'] = '<a href="' . esc_url( $url ) . '">Dupliquer</a>';
    return $actions;
}
add_filter( 'post_row_actions', 'wpal_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'wpal_duplicate_post_link', 10, 2 );

function wpal_do_duplicate_post() {
    if (
        empty( $_GET['action'] ) ||
        'wpal_duplicate_post' !== $_GET['action'] ||
        empty( $_GET['post_id'] )
    ) {
        return;
    }
    $post_id = absint( $_GET['post_id'] );
    check_admin_referer( 'wpal_duplicate_' . $post_id );
    if ( ! current_user_can( 'edit_posts' ) ) {
        wp_die( 'Permission refusée.' );
    }
    $original = get_post( $post_id );
    if ( ! $original ) {
        wp_die( 'Article introuvable.' );
    }

    // Créer le duplicata en brouillon.
    $new_id = wp_insert_post( [
        'post_title'   => $original->post_title . ' (copie)',
        'post_content' => $original->post_content,
        'post_excerpt' => $original->post_excerpt,
        'post_type'    => $original->post_type,
        'post_status'  => 'draft',
        'post_author'  => get_current_user_id(),
        'post_parent'  => $original->post_parent,
    ] );
    if ( is_wp_error( $new_id ) ) {
        wp_die( 'Erreur lors de la duplication : ' . $new_id->get_error_message() );
    }

    // Copier les métadonnées (image à la une, Rank Math, champs ACF, etc.).
    $metas = get_post_meta( $post_id );
    foreach ( $metas as $key => $values ) {
        foreach ( $values as $value ) {
            add_post_meta( $new_id, $key, maybe_unserialize( $value ) );
        }
    }

    // Copier les taxonomies (catégories, étiquettes, etc.).
    $taxonomies = get_object_taxonomies( $original->post_type );
    foreach ( $taxonomies as $taxonomy ) {
        $terms = wp_get_object_terms( $post_id, $taxonomy, [ 'fields' => 'ids' ] );
        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
            wp_set_object_terms( $new_id, $terms, $taxonomy );
        }
    }

    // Rediriger vers l'éditeur du duplicata.
    wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_id ) );
    exit;
}
add_action( 'admin_action_wpal_duplicate_post', 'wpal_do_duplicate_post' );

Ce code copie le contenu, l’extrait, les métadonnées (y compris l’image à la une et les champs Rank Math), les taxonomies et les catégories. Le duplicata est créé avec le statut draft pour éviter toute publication accidentelle. La fonction check_admin_referer() protège contre les attaques CSRF.

Après avoir ajouté ce code, rechargez la liste des articles dans l’administration : un lien « Dupliquer » apparaît au survol de chaque article ou page.

Méthode 3 : dupliquer avec WP-CLI en une ligne

WP-CLI est l’outil en ligne de commande de WordPress. Il est idéal pour dupliquer des articles de façon scriptée ou en masse, par exemple lors d’une migration ou pour créer des variantes de landing pages.

La commande de base pour dupliquer un article avec l’ID 123 :

# Récupérer le contenu de l'article original
wp post get 123 --fields=post_title,post_content,post_excerpt,post_type --format=json

# Créer un duplicata avec le titre modifié
wp post create 
  --post_title="Titre de l'article (copie)" 
  --post_content="$(wp post get 123 --field=post_content)" 
  --post_excerpt="$(wp post get 123 --field=post_excerpt)" 
  --post_type=post 
  --post_status=draft

Pour dupliquer l’image à la une et les métadonnées :

#!/bin/bash
# duplicate-wp-post.sh : Duplique un article WordPress via WP-CLI
# Usage : bash duplicate-wp-post.sh 123

ORIG_ID=$1
NEW_ID=$(wp post create 
  --post_title="$(wp post get $ORIG_ID --field=post_title) (copie)" 
  --post_content="$(wp post get $ORIG_ID --field=post_content)" 
  --post_excerpt="$(wp post get $ORIG_ID --field=post_excerpt)" 
  --post_type="$(wp post get $ORIG_ID --field=post_type)" 
  --post_status=draft 
  --porcelain)

echo "Duplicata créé : ID $NEW_ID"

# Copier l'image à la une
THUMBNAIL_ID=$(wp post meta get $ORIG_ID _thumbnail_id)
if [ -n "$THUMBNAIL_ID" ]; then
  wp post meta set $NEW_ID _thumbnail_id $THUMBNAIL_ID
  echo "Image à la une copiée : $THUMBNAIL_ID"
fi

# Copier la méta-description Rank Math
RANK_META=$(wp post meta get $ORIG_ID rank_math_description)
if [ -n "$RANK_META" ]; then
  wp post meta set $NEW_ID rank_math_description "$RANK_META"
fi

# Copier les catégories
CATS=$(wp post term list $ORIG_ID category --field=term_id | tr 'n' ',')
if [ -n "$CATS" ]; then
  wp post term set $NEW_ID category ${CATS%,}
fi

echo "Duplication terminée. Éditez : $(wp option get siteurl)/wp-admin/post.php?action=edit&post=$NEW_ID"

Ce script duplique un article complet en moins de cinq secondes. Pour dupliquer dix articles d’un même type, adaptez-le avec une boucle for ORIG_ID in 123 124 125 ....

Méthode 4 : dupliquer via l’API REST WordPress

L’API REST de WordPress expose les articles et les pages sur les endpoints /wp-json/wp/v2/posts et /wp-json/wp/v2/pages. Elle permet de dupliquer un contenu depuis n’importe quel client HTTP, ce qui est utile dans les architectures headless ou les pipelines CI/CD.

Prérequis : un mot de passe d’application WordPress (disponible dans Profil utilisateur depuis WordPress 5.6). L’API REST utilise l’authentification HTTP Basic avec ce mot de passe.

#!/bin/bash
# Dupliquer un article via l'API REST WordPress
SITE="https://wpadminlab.com"
USER="votre-login"
APP_PASS="xxxx xxxx xxxx xxxx xxxx xxxx"  # mot de passe d'application
ORIG_ID=123

# Récupérer l'article original
ORIG=$(curl -s "$SITE/wp-json/wp/v2/posts/$ORIG_ID" 
  -u "$USER:$APP_PASS")

TITLE=$(echo "$ORIG" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['title']['raw'])")
CONTENT=$(echo "$ORIG" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['content']['raw'])")
EXCERPT=$(echo "$ORIG" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['excerpt']['raw'])")

# Créer le duplicata
curl -s -X POST "$SITE/wp-json/wp/v2/posts" 
  -u "$USER:$APP_PASS" 
  -H "Content-Type: application/json" 
  -d "$(python3 -c "
import json, sys
payload = {
  'title': '$TITLE (copie)',
  'content': '$CONTENT',
  'excerpt': '$EXCERPT',
  'status': 'draft'
}
print(json.dumps(payload))
")" | python3 -c "import sys,json; d=json.load(sys.stdin); print('Nouveau post ID:', d.get('id'), '| URL:', d.get('link'))"

Cette méthode fonctionne même depuis un serveur distant ou depuis un script Python/Node.js. Elle ne copie pas automatiquement les métadonnées personnalisées (ACF, Rank Math) car l’API REST n’expose que les champs enregistrés avec register_meta et show_in_rest: true. Pour les métadonnées complètes, préférez la méthode functions.php ou WP-CLI.

Conserver le SEO lors d’une duplication WordPress

Dupliquer une page ou un article sans précautions crée des problèmes de contenu dupliqué que les moteurs de recherche détectent rapidement. Voici les règles à respecter :

  • Titre et slug : changez systématiquement le titre et le permalink du duplicata avant publication. Deux pages avec des titres identiques ou proches vont cannibaliser le même mot clé.
  • Méta-description : rédigez une nouvelle méta-description unique. Un duplicata garde la méta de l’original si vous copiez les métadonnées Rank Math.
  • Canonical : si vous publiez temporairement deux versions quasi-identiques (tests A/B, pages multilingues sans plugin), ajoutez une balise <link rel="canonical"> sur la version secondaire pointant vers la version principale. Voir notre guide sur les sites multilingues WordPress sans plugin pour les balises hreflang.
  • Redirections 301 : si le duplicata remplace l’original à terme, configurez une redirection 301 WordPress sans plugin depuis l’ancien slug vers le nouveau.
  • Indexation : gardez le duplicata en noindex via Rank Math tant que le contenu n’est pas suffisamment différencié. Activez l’indexation uniquement après avoir personnalisé le contenu.

Pour purger le cache serveur après la publication d’un duplicata, consultez notre guide vider le cache WordPress sans plugin afin que la nouvelle URL soit immédiatement servie en version fraîche.

Comparatif des quatre méthodes

Voici un tableau récapitulatif pour choisir la méthode selon votre contexte :

  • Copier-coller Gutenberg : sans code, ponctuel, 1 à 3 articles, ne copie pas l’image à la une ni les métadonnées SEO.
  • functions.php / mu-plugin : lien admin permanent, copie complète (contenu, métadonnées, taxonomies, image à la une), nécessite d’éditer PHP une fois.
  • WP-CLI : scriptable, en masse, idéal en SSH sur VPS ou serveur dédié. Requiert WP-CLI installé sur le serveur.
  • API REST : headless, CI/CD, multi-sites, sans accès SSH. Copie partielle (métadonnées selon register_meta).

Pour un usage régulier en administration, la méthode functions.php (mu-plugin) offre le meilleur rapport entre simplicité et complétude. Pour les environnements headless ou les pipelines automatisés, l’API REST combinée à un post-traitement des métadonnées est la solution la plus portable.

Quand un plugin reste justifié

Les quatre méthodes couvrent les cas standards. Un plugin devient pertinent dans trois situations spécifiques :

  • WooCommerce : les produits ont des métadonnées complexes (prix, stock, variations, attributs) que wp_insert_post() seul ne copie pas correctement. Le plugin officiel WooCommerce Product Duplicator ou l’extension Yoast Duplicate Post gèrent ces données proprement.
  • Constructeurs de page (Elementor, Divi, Beaver Builder) : ces outils stockent leur contenu dans des formats sérialisés propriétaires. Copier le post_content brut peut aboutir à un résultat partiel. Utilisez la duplication intégrée à l’outil (Elementor propose nativement « Enregistrer comme modèle » et « Dupliquer »).
  • Volume industriel (50 pages par semaine ou plus) : Yoast Duplicate Post ajoute une interface de gestion des doublons, un tableau de bord de comparaison et des options de filtrage de métadonnées que les méthodes manuelles n’offrent pas.

En dehors de ces trois cas, les méthodes présentées ci-dessus suffisent et évitent d’alourdir WordPress avec une dépendance tierce supplémentaire.

FAQ : dupliquer une page WordPress sans plugin

Est-ce que WordPress permet de dupliquer une page nativement ?

Non. WordPress Core ne propose pas de fonction de duplication dans l’interface d’administration. Il faut passer par Gutenberg (copier-coller), un hook PHP dans functions.php, WP-CLI ou l’API REST pour dupliquer un article ou une page sans plugin.

Quelle est la différence entre dupliquer et cloner un article WordPress ?

Les deux termes désignent la même opération : créer une copie d’un article ou d’une page existant. « Cloner » est souvent employé par les plugins (Clone Post, Duplicate Post) alors que « dupliquer » est le terme courant en français. Techniquement, les deux créent un nouveau post_id avec le même contenu.

La duplication copie-t-elle l’image à la une ?

Avec la méthode copier-coller Gutenberg, non : l’image à la une n’est pas copiée. Avec la méthode functions.php présentée dans cet article, oui : la métadonnée _thumbnail_id est copiée avec toutes les autres métadonnées. Avec WP-CLI, le script dédié copie explicitement _thumbnail_id.

Peut-on dupliquer une page WordPress en conservant tous les champs ACF ?

Oui. Advanced Custom Fields stocke ses valeurs dans wp_postmeta. La méthode functions.php copie l’intégralité de wp_postmeta via get_post_meta() et add_post_meta(), ce qui inclut tous les champs ACF. La méthode WP-CLI requiert une copie explicite des métadonnées ACF via wp post meta.

Dupliquer une page crée-t-il un problème de contenu dupliqué pour Google ?

Oui, si le duplicata est publié tel quel avec le même contenu. Google détecte le contenu dupliqué et peut déclasser ou ignorer l’une des deux versions. La bonne pratique est de garder le duplicata en brouillon (draft) ou en noindex jusqu’à ce qu’il soit suffisamment différencié, puis de publier avec un titre, un slug et une méta-description uniques.

G
WP Admin Lab

Architecte web full-stack. WordPress, performance, data et sécurité. Notes de terrain, tests reproductibles et retours d'expérience.