Ce guide vous montre comment déplacer du contenu entre deux sites WordPress avec les écrans intégrés Outils → Exporter et Outils → Importer. Il s’adresse à toute personne qui fusionne deux sites, en sépare un en deux, ou reprend certains articles dans un nouveau site. L’export vous donne un fichier WXR, pour WordPress eXtended RSS, un document XML (un format texte pour données structurées) qui contient vos articles et les fiches qui s’y rattachent. Ce qui surprend, c’est tout ce que le fichier laisse de côté. Les réglages du thème, les widgets, les commandes WooCommerce et les éléments des constructeurs de pages vivent hors des tables de contenu standard. Ils restent donc sur l’ancien site. Servez-vous de l’export et de l’import quand vous voulez du contenu choisi sur un autre site, et d’une migration complète de la base de données quand vous voulez le même site ailleurs.
Ce que vous allez accomplir
- Décider en deux minutes si un export WXR convient à votre déplacement, ou s’il vous faut plutôt une migration complète de la base de données.
- Produire un export que le site d’arrivée acceptera vraiment, y compris un export découpé quand le fichier dépasse la limite de téléversement.
- Importer articles, pages, types de contenu personnalisés, taxonomies, commentaires et médias sur un hébergement cPanel sans que la requête expire.
- État final : les comptes d’articles, de termes, de commentaires et de médias concordent sur les deux sites, et plus aucun corps d’article ne pointe vers l’ancien domaine.
Prérequis
- WordPress 5.9 ou plus récent des deux côtés, et un compte avec le rôle Administrateur sur chacun.
- L’extension WordPress Importer sur le site d’arrivée. WordPress propose de l’installer la première fois que vous ouvrez Outils → Importer.
- Un accès cPanel sur le site d’arrivée, pour lire et relever les limites PHP dans MultiPHP INI Editor.
- Facultatif mais bien utile : un accès shell en SSH (Secure Shell, un terminal distant chiffré) avec WP-CLI, l’outil de ligne de commande de WordPress, disponible sous le nom
wp. Les commandes ci-dessous supposent que le site se trouve dans~/public_html. - Une sauvegarde récente du site d’arrivée. Un import ajoute du contenu et ne se défait pas d’un seul clic.
Deux différences entre les deux sites comptent plus que tout le reste. Le site d’arrivée doit déjà connaître chaque type de contenu personnalisé présent dans le fichier. Un type de contenu personnalisé (CPT, pour custom post type) est un type de contenu qu’une extension ou un thème déclare en plus des articles et des pages. C’est pareil pour les taxonomies personnalisées. Les éléments dont le type manque sont écartés sans erreur franche. Et les limites PHP varient beaucoup d’un hébergeur à l’autre : lisez les chiffres du site d’arrivée plutôt que de supposer qu’ils ressemblent à ceux du départ.
Comment ça fonctionne
Un export parcourt les tables de contenu standard et écrit un élément XML <item> par fiche. Articles, pages, types de contenu personnalisés, fichiers joints et éléments de menu deviennent tous des items, chacun avec son titre, son corps, ses dates, son statut, ses termes et ses champs personnalisés. Les utilisateurs apparaissent sous forme de noms d’auteur, pour que l’importateur attribue les articles, sans mots de passe ni rôles. Les commentaires voyagent à l’intérieur de leur item parent.
Les médias sont la partie que l’on lit de travers. Le fichier note l’adresse de chaque fichier téléversé, pas le fichier lui-même. L’importateur peut aller chercher chacun d’eux en HTTP sur le site de départ si vous cochez Télécharger et importer les fichiers joints. Le site de départ doit donc rester en ligne et joignable publiquement pendant l’import.
Tout ce qui vit hors de ces tables est absent. Les options du thème, le customizer et la disposition des widgets n’entrent jamais dans le fichier. Les réglages d’extensions dans wp_options non plus, pas plus que les commandes et les stocks WooCommerce, les entrées de formulaires, les abonnements et les caches des constructeurs de pages. Cette frontière est toute la décision à prendre.
Si votre déplacement a besoin du panneau de droite, vous voulez plutôt une copie des fichiers et de la base de données. Le guide sur les extensions de migration WordPress couvre cette route. Cet arbre de décision en donne la version courte.
Étapes
1. Comptez ce qu’il y a sur le site de départ. Ces chiffres deviendront votre preuve plus tard, alors notez-les avant de toucher à quoi que ce soit.
wp post list --post_type=post --post_status=any --format=count
wp post list --post_type=page --post_status=any --format=count
wp post list --post_type=attachment --post_status=any --format=count
wp term list category --format=count
wp comment list --format=count
482
37
1204
28
913
Chaque commande affiche un seul nombre. Si vous avez des types de contenu personnalisés, listez-les avec wp post-type list --field=name et comptez chacun de la même façon.
2. Lisez les vraies limites du site d’arrivée. L’import est un téléversement de fichier suivi d’une longue exécution PHP, alors quatre réglages décident s’il peut aller au bout.
wp eval 'foreach (["upload_max_filesize","post_max_size","max_execution_time","memory_limit"] as $k) echo "$k = ".ini_get($k)."\n";'
upload_max_filesize = 2M
post_max_size = 8M
max_execution_time = 30
memory_limit = 128M
Sans accès shell, les mêmes chiffres apparaissent sous Outils → Santé du site → Informations → Serveur. Relevez-les dans cPanel sous Software → MultiPHP INI Editor, en mode Editor, pour le domaine d’arrivée. Mettez upload_max_filesize à 64M, post_max_size à 64M, max_execution_time à 300 et memory_limit à 256M. Deux règles comptent si votre hébergeur vous plafonne plus bas : post_max_size doit valoir au moins autant que upload_max_filesize, et upload_max_filesize devrait valoir au moins le double du plus gros fichier à téléverser. Enregistrez, puis relancez la commande pour confirmer que les nouvelles valeurs sont bien prises.
3. Préparez le site d’arrivée à recevoir le contenu. Installez et activez le thème et les extensions qui déclarent vos types de contenu et vos taxonomies personnalisés, avant de lancer l’import. Comparez les deux côtés.
wp post-type list --field=name
wp taxonomy list --field=name
post
page
attachment
nav_menu_item
portfolio
Chaque nom présent sur la liste du départ mais absent de celle de l’arrivée annonce du contenu que l’importateur va écarter. Installez d’abord ce qui le déclare.
4. Exportez le contenu. Dans l’administration, ouvrez Outils → Exporter, choisissez Tout le contenu ou une seule section, puis cliquez sur Télécharger le fichier d’export. Au-delà de quelques centaines d’articles, WP-CLI est plus solide, car il ne s’exécute pas dans une requête de navigateur.
wp export --dir=/home/<user>/exports --post_type=post,page,portfolio
Starting export process...
Writing to file /home/<user>/exports/example.wordpress.2026-09-18.000.xml
Success: All done with export.
Filtres utiles : --start_date=2024-01-01 et --end_date=2024-12-31 pour découper par date, --author=<login> pour une seule signature, --post_status=publish pour laisser les brouillons, et --skip_comments quand les commentaires ne sont pas voulus. Vérifiez que le fichier est du XML bien formé avant de le déplacer.
xmllint --noout /home/<user>/exports/example.wordpress.2026-09-18.000.xml && echo "XML is well-formed"
ls -lh /home/<user>/exports/
XML is well-formed
-rw-r--r-- 1 user user 41M Sep 18 09:12 example.wordpress.2026-09-18.000.xml
5. Découpez un export trop gros. La taille qui compte est celle du fichier .xml face au upload_max_filesize de l’étape 2. WP-CLI découpe l’export pour vous, et le nombre est en mégaoctets.
wp export --dir=/home/<user>/exports --max_file_size=8
Writing to file /home/<user>/exports/example.wordpress.2026-09-18.000.xml
Writing to file /home/<user>/exports/example.wordpress.2026-09-18.001.xml
Writing to file /home/<user>/exports/example.wordpress.2026-09-18.002.xml
Success: All done with export.
Choisissez une valeur d’au plus la moitié de upload_max_filesize, ce qui laisse de la place au reste du téléversement. Depuis l’administration, exportez plutôt une section à la fois avec les boutons radio d’Outils → Exporter, ou resserrez la plage de dates. Importez les morceaux dans l’ordre des numéros, et importez le fichier qui contient les médias avant les articles qui les citent.
6. Lancez l’import depuis l’administration. Sur le site d’arrivée, ouvrez Outils → Importer, trouvez WordPress au bas de la liste, cliquez sur Installer maintenant, puis sur Lancer l’importateur. Choisissez votre fichier .xml et appuyez sur Téléverser le fichier et l’importer.
L’écran suivant pose deux questions. Pour les auteurs, associez chaque signature du départ à un compte existant, ou tapez un nouvel identifiant pour en créer un. Pour les médias, cochez Télécharger et importer les fichiers joints afin que l’importateur aille chercher chaque fichier sur le site de départ. Laissez la case vide si vous comptez copier vous-même le dossier uploads en SFTP.
Une exécution terminée se conclut par « All done. » et une liste des éléments écartés. Lisez cette liste plutôt que de fermer la page.
7. Importez en SSH quand le passage par le navigateur échoue. Un gros fichier, un délai d’attente de mandataire ou un plafond de téléversement sévère mènent tous au même endroit. Installez l’extension d’import et lancez l’import depuis le shell, où aucune requête web ne peut expirer.
wp plugin install wordpress-importer --activate
wp import /home/<user>/exports/example.wordpress.2026-09-18.000.xml --authors=create
Starting the import process...
Processing post #412 ("Spring release notes") (post)
-- 1 of 482
...
Success: Finished importing from '/home/<user>/exports/example.wordpress.2026-09-18.000.xml' file.
Trois options pèsent lourd. --authors=create crée un compte par auteur du départ, --authors=skip vous attribue tout, et --authors=mapping.csv suit un fichier à deux colonnes d’anciens et de nouveaux identifiants. Ajoutez --skip=attachment pour laisser les médias tranquilles, et --skip=image_resize pour importer les médias sans générer les miniatures, que vous reconstruirez ensuite avec wp media regenerate --only-missing --yes. Pour charger plusieurs fichiers découpés dans l’ordre, faites une boucle.
for f in /home/<user>/exports/example.wordpress.2026-09-18.*.xml; do wp import "$f" --authors=create; done
Success: Finished importing from '.../2026-09-18.000.xml' file.
Success: Finished importing from '.../2026-09-18.001.xml' file.
Success: Finished importing from '.../2026-09-18.002.xml' file.
8. Réécrivez les anciennes adresses restées dans les corps d’articles. L’importateur réécrit l’adresse des médias qu’il a téléchargés, et laisse tous les autres liens vers l’ancien domaine tels quels. Trouvez-les, puis remplacez-les.
wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run --report-changed-only
Table Column Replacements Type
wp_postmeta meta_value 64 SQL
wp_posts post_content 311 SQL
Success: 375 replacements to be made.
Lisez la liste des tables, puis relancez la même commande sans --dry-run pour l’appliquer. WP-CLI recalcule les longueurs en octets à l’intérieur des valeurs PHP sérialisées, ce qu’un simple remplacement de texte ne fait pas. Terminez en vidant les règles de permaliens, car les nouveaux types de contenu ont besoin que leurs règles de réécriture soient reconstruites.
wp rewrite flush --hard
Success: Rewrite rules flushed.
Vérifier que ça fonctionne
Relancez les comptes de l’étape 1 sur le site d’arrivée et comparez-les.
wp post list --post_type=post --post_status=any --format=count
wp post list --post_type=attachment --post_status=any --format=count
wp term list category --format=count
wp comment list --format=count
482
1204
28
913
La barre à atteindre est une égalité exacte pour les articles et les termes. Le compte de médias peut légitimement être plus bas si vous avez écarté les médias exprès. Vérifiez ensuite trois autres choses.
wp post list --post_type=post --format=count --s='old.example.com'
wp post list --post_type=attachment --field=ID | head -n 5 | xargs -I{} wp post get {} --field=guid
0
https://new.example.com/wp-content/uploads/2026/03/hero.jpg
https://new.example.com/wp-content/uploads/2026/03/team.jpg
...
Zéro article qui mentionne l’ancien domaine veut dire que l’étape 8 a fonctionné. Des adresses de médias sur le nouveau domaine veulent dire que les fichiers sont arrivés. Enfin, ouvrez trois articles importés dans le navigateur : un avec des images, un avec une catégorie, et un avec des commentaires. Chacun devrait afficher son image mise en avant, montrer ses termes sous le titre et lister ses commentaires.
Dépannage
L’import s’arrête à mi-chemin sur une page blanche. PHP a atteint max_execution_time ou manqué de mémoire. Rechargez Outils → Importer et relancez le même fichier, car l’importateur saute les éléments déjà présents et repart où il s’est arrêté. S’il cale chaque fois sur le même article, montez max_execution_time à 600 dans MultiPHP INI Editor, ou passez à la route WP-CLI de l’étape 7, qui n’a aucun délai web.
Le téléversement est refusé avant même le début de l’import. Un message sur un fichier qui dépasse la taille maximale veut dire que upload_max_filesize ou post_max_size reste trop bas. Revérifiez les deux avec la commande de l’étape 2, car certains hébergeurs appliquent une seconde limite au niveau du serveur, qui l’emporte sur l’éditeur. Quand vous ne pouvez pas les relever, découpez l’export comme à l’étape 5.
Les articles sont arrivés, mais pas les images. Soit la case des fichiers joints n’était pas cochée, soit l’importateur n’a pas pu joindre le site de départ. Il va chercher chaque fichier en HTTP sur l’ancien domaine : un site protégé par mot de passe, derrière un pare-feu ou dont l’entrée DNS est morte ne renvoie rien. Remettez le site de départ en ligne et relancez l’import, ou copiez wp-content/uploads en SFTP puis lancez wp media import pour les fichiers à rattacher.
Tous les articles appartiennent au mauvais auteur. Cela arrive quand l’écran d’association a été sauté ou que --authors=skip a servi. Réattribuez en lot plutôt qu’article par article.
wp post list --post_type=post --author=1 --format=ids | xargs wp post update --post_author=7
Success: Updated post 412.
Success: Updated post 413.
Trouvez l’identifiant numérique du compte voulu avec wp user list --fields=ID,user_login,display_name.
Des doublons apparaissent après une deuxième exécution. L’importateur se fie à l’identifiant et à l’adresse d’origine de l’article, alors il saute normalement ce qui est déjà là. Modifier un article entre deux exécutions, ou importer le même contenu depuis deux exports différents, peut déjouer ce contrôle. Repérez les répétitions par titre, puis supprimez les copies en trop.
wp post list --post_type=post --field=post_title | sort | uniq -d
Spring release notes
Pricing update 2026
Quand ce n’est pas la bonne approche
Un export WXR est le mauvais outil dès que la valeur du site vit hors des tables d’articles. Les commandes, les clients, les coupons et les stocks WooCommerce logent dans leurs propres tables et ne seront pas dans le fichier. Passez par l’exportateur CSV de la boutique, ou déplacez toute la base de données. Les entrées de formulaires, les abonnements, la progression des cours en ligne et les calendriers de réservation racontent la même histoire. Les constructeurs de pages varient. Certains gardent la mise en page dans le corps de l’article et voyagent bien. D’autres rangent leurs éléments et leurs styles globaux dans wp_options, et arrivent en coquilles vides.
Si vous déplacez le même site vers un nouvel hébergeur sans rien changer, copiez plutôt les fichiers et la base de données. La comparaison des extensions de migration couvre cette route, et les permaliens brisés après une migration traite du problème d’atterrissage le plus courant. Pour un hébergement infogéré avec ses propres règles d’export, commencez par quitter WP Engine. Toutes les options de la route en ligne de commande sont documentées dans la référence WP-CLI export, et les écrans d’administration sont décrits dans la documentation WordPress.
Un WordPress qui rapporte vraiment mérite un opérateur — Stack Harbor opère cette pile sous WordPress Entreprise ; réservez une consultation d’infrastructure.