Skip to content

Tout pour WordPress, le développement web — et plus encore

🔧 WP All Import : comment rassembler toutes les images d'un article dans une seule galerie

🔧 WP All Import : comment rassembler toutes les images d'un article dans une seule galerie

Vous avez importé une centaine d’articles via WP All Import, et les images se sont dispersées n’importe comment dans le contenu: étirées en pleine largeur à certains endroits, compressées contre le texte à d’autres, ou affichées en liens brisés ailleurs. Reprendre chaque article manuellement, c’est une soirée de perdue.

Il existe un moyen de tout rassembler dans une seule galerie. Automatiquement, sans retoucher le contenu à la main. La méthode fonctionne aussi bien pour des imports frais que pour des articles chargés il y a un mois. Voici deux approches: la plus simple (à la volée, via le hook pmxi_gallery_image) et la corrective (avec une mise à jour groupée). Les deux ont été testées sur WP All Import 4.9+.

💡 Aperçu rapide:

  • Préparez votre CSV ou XML: les liens des images en URLs complètes, une par ligne
  • Dans le modèle d’import, configurez la section Images et indiquez le champ qui contient les images
  • Ajoutez le hook pmxi_gallery_image dans functions.php, la galerie s’assemble toute seule pendant l’import
  • Pour les articles déjà en ligne: une fonction qui remplace les <img> par le shortcode de galerie, puis une mise à jour groupée

Comment préparer les images pour l’import

Avant de lancer l’import, les liens des images doivent être dans le bon format. WP All Import ne télécharge les images que si l’URL est complète, directe et pointe vers un fichier, pas vers une page HTML.

Imaginons que sur l’ancien site, la galerie ressemble à ceci:

1<a href="/cache/images/photo1.jpg" data-lightbox="group:1" title="Photo 1">
2 <img src="/cache/images/photo1_thumb.jpg" alt="Photo 1">
3</a>
4<a href="/cache/images/photo2.jpg" data-lightbox="group:1" title="Photo 2">
5 <img src="/cache/images/photo2_thumb.jpg" alt="Photo 2">
6</a>

Après parsing, dans le fichier CSV destiné à l’import, les liens doivent devenir des URLs complètes, une par ligne, sans enrobage HTML:

1http://newsite.com/files/photo1.jpg
2http://newsite.com/files/photo2.jpg

http://newsite.com est le domaine du site vers lequel vous importez. Point critique: si les liens sont relatifs ou pointent vers l’ancien domaine, WP All Import ne récupérera pas les fichiers et ne les téléchargera pas dans la médiathèque.

Les liens présents dans le corps de l’article doivent correspondre un à un avec ceux que vous fournissez au plugin pour le téléchargement. Sinon, après l’import, certaines balises <img> conserveront les anciennes URLs et ne seront pas intégrées à la galerie.

Configurer le modèle d’import dans WP All Import

Dans l’interface du plugin, allez dans le modèle d’import. La section principale ici est Images. Elle se présente ainsi:

Interface des paramètres d'image de WP All Import

Dans la section Images, indiquez le champ qui contient les liens des images. Il s’agit généralement d’une cellule CSV distincte (par exemple gallery_images), où les liens sont listés avec un séparateur, par défaut |:

1http://newsite.com/files/photo1.jpg | http://newsite.com/files/photo2.jpg | http://newsite.com/files/photo3.jpg

WP All Import va parser la chaîne, télécharger chaque image et l’ajouter à la médiathèque WordPress. Mais pour l’instant, les images sont simplement attachées à l’article en tant que fichiers joints. Nous allons assembler la galerie séparément.

Vérifiez bien comment le plugin gère le téléchargement. Cliquez sur Aperçu et test, puis sur Lancer le test. Une coche verte en regard du nombre d’images signifie que tout est correctement configuré. Une croix rouge signifie qu’il faut vérifier les URLs: elles doivent être complètes et directes.

Avant de démarrer l’import, téléversez les fichiers image dans le dossier files à la racine du site, si le plugin récupère les images depuis le serveur et non depuis des URLs externes.

Comment assembler la galerie à la volée: le hook pmxi_gallery_image

La méthode la plus propre consiste à assembler la galerie directement pendant l’import. WP All Import fournit le hook pmxi_gallery_image, qui se déclenche pour chaque image téléchargée. Vous interceptez l’ID du fichier joint et l’enregistrez dans un champ meta de l’article, dans le format souhaité.

Trois variantes testées, à choisir selon votre thème ou votre plugin de galerie.

Variante 1: tableau d’IDs de fichiers joints. Convient à la plupart des thèmes qui attendent la galerie sous forme d’un tableau d’IDs:

1function my_gallery_ids($post_id, $att_id, $filepath, $is_keep_existing_images)
2{
3 $key = '_my_gallery';
4 $gallery = get_post_meta($post_id, $key, true);
5
6 if (empty($gallery)) {
7 $gallery = array();
8 }
9
10 if (!in_array($att_id, $gallery)) {
11 $gallery[] = $att_id;
12 update_post_meta($post_id, $key, $gallery);
13 }
14}
15add_action('pmxi_gallery_image', 'my_gallery_ids', 10, 4);

Variante 2: tableau d’URLs. Si le thème a besoin de liens directs vers les images en taille réelle:

1function my_gallery_urls($post_id, $att_id, $filepath, $is_keep_existing_images)
2{
3 $key = '_my_gallery';
4 $size = 'full';
5 $gallery = get_post_meta($post_id, $key, true);
6
7 if (empty($gallery)) {
8 $gallery = array();
9 }
10
11 if (!isset($gallery[$att_id])) {
12 $src = wp_get_attachment_image_src($att_id, $size);
13 $gallery[$att_id] = $src[0];
14 update_post_meta($post_id, $key, $gallery);
15 }
16}
17add_action('pmxi_gallery_image', 'my_gallery_urls', 10, 4);

Variante 3: chaîne avec séparateur. Si le champ meta stocke les IDs séparés par une virgule (format "23,25,31"):

1function my_gallery_string($post_id, $att_id, $filepath, $is_keep_existing_images)
2{
3 $key = '_my_gallery';
4 $sep = ',';
5 $gallery = get_post_meta($post_id, $key, true);
6
7 if (is_string($gallery) || empty($gallery) || $gallery == false) {
8 $gallery = explode($sep, $gallery);
9 if (!in_array($att_id, $gallery)) {
10 if ($gallery[0] == '') unset($gallery[0]);
11 $gallery[] = $att_id;
12 update_post_meta($post_id, $key, implode($sep, $gallery));
13 }
14 }
15}
16add_action('pmxi_gallery_image', 'my_gallery_string', 10, 4);

Le code s’insère dans le functions.php du thème. Une fois l’import terminé, le hook peut être supprimé, le champ meta est déjà rempli. Avantage de cette méthode: la galerie est prête immédiatement après l’import, sans passe supplémentaire.

Que faire avec les articles déjà importés

Si les articles sont déjà en ligne et que les images traînent dans le contenu sous forme de simples balises <img>, il faut une approche différente. Parcourez tous les articles et remplacez les balises par le shortcode de galerie.

La fonction ci-dessous collecte tous les IDs de fichiers joints d’un article et remplace les <img> dans le contenu par [gallery ids="..."]:

1function replace_post_images_with_gallery($post_id)
2{
3 $post = get_post($post_id);
4 if (!$post) return;
5
6 $attachments = get_attached_media('image', $post_id);
7
8 if (empty($attachments)) return;
9
10 $ids = array();
11 foreach ($attachments as $att) {
12 $ids[] = $att->ID;
13 }
14
15 $gallery_shortcode = '[gallery ids="' . implode(',', $ids) . '"]';
16 $content = preg_replace('/<img[^>]+>/i', '', $post->post_content);
17 $content = $gallery_shortcode . "\n\n" . $content;
18
19 wp_update_post(array(
20 'ID' => $post_id,
21 'post_content' => $content,
22 ));
23}

Ensuite, lancez une mise à jour groupée:

  • Dans le panneau d’administration, allez dans la liste de tous les articles.
  • Dans les options de l’écran, réglez le nombre d’éléments à 50 (optimal pour ne pas faire planter le serveur).
  • Sélectionnez tous les articles, choisissez «Mettre à jour» dans les actions groupées, puis appliquez.

WordPress va parcourir chaque article, appeler save_post et les hooks associés. Si la fonction dans functions.php est accrochée à save_post, elle s’exécutera. Une fois terminé, **supprimez le code de **functions.php, sinon, à chaque enregistrement d’article, le contenu sera reconstruit à nouveau.

⁉️🤔 Questions fréquentes

WP All Import** ne télécharge pas les images pendant l’import, qu’est-ce qui ne va pas?**

Les liens dans le fichier d’import doivent être des URLs complètes (avec http:// ou https://) et mener directement à un fichier image, pas à une page HTML. Vérifiez les droits d’écriture sur wp-content/uploads: si le serveur ne peut pas enregistrer le fichier, l’import de l’image est silencieusement ignoré. La raison la plus fréquente est une discordance entre les liens dans le corps du contenu et ceux dans le champ Images du modèle. Si le contenu contient http://oldsite.com/img.jpg, et que le champ Images reçoit http://newsite.com/files/img.jpg, le plugin ne fera pas le lien et l’image restera cassée. Les URLs doivent correspondre une à une.

Pourquoi pmxi_gallery_image est-il préférable à un traitement post-import?

Le hook se déclenche pour chaque image au moment du téléchargement, la galerie est prête juste après l’import, sans seconde passe. Le traitement post-import via wp_update_post sollicite le serveur: mille articles génèrent mille appels à save_post. Pour des volumes jusqu’à 100 articles, la différence est négligeable, mais pour de grosses migrations, le hook fait gagner des heures. De plus, pmxi_gallery_image donne accès au chemin du fichier téléchargé et à l’ID du fichier joint, vous pouvez immédiatement programmer n’importe quelle logique: répartir par dossiers, ajouter à un slider, synchroniser avec un CDN. Le post-import n’offre pas cette flexibilité.

Est-il obligatoire de supprimer le code de functions.php après l’import?

Oui. Si la fonction est accrochée à pmxi_gallery_image, elle se déclenche à CHAQUE ajout de fichier joint, résultat: des doublons dans le champ meta de la galerie lors d’un téléversement manuel d’images. Le hook s’exécute une fois, une fois l’import terminé, il peut être supprimé sans risque. Si la fonction est liée à save_post ou utilisée dans une mise à jour groupée, il est d’autant plus important de la supprimer. Sinon, chaque modification d’article reconstruira le contenu, supprimant les balises <img> et réécrivant la galerie.

Comment laisser certaines images en dehors de la galerie?

Excluez-les du remplacement. Dans la variante avec pmxi_gallery_image, ajoutez une condition basée sur la taille ou le texte alternatif. Dans la variante post-import, au lieu d’un preg_replace sur tous les <img>, utilisez un remplacement sélectif: conservez les images ayant une classe CSS ou un attribut spécifique, supprimez les autres et remplacez-les par la galerie. Par exemple, <img class="keep"> reste dans le contenu, tous les autres <img> sont remplacés par [gallery]. Cela se résout en affinant l’expression régulière dans la fonction de remplacement.

Faut-il WP All Import Pro ou la version gratuite suffit-elle?

La version gratuite peut importer des images dans la médiathèque et les attacher à un article. Le hook pmxi_gallery_image y est également disponible. La version Pro ajoute: le chargement d’images depuis des URLs externes, les imports Cron planifiés, l’exécution de fonctions PHP directement dans le modèle d’import, et la prise en charge des champs personnalisés. Pour un import ponctuel avec des fichiers locaux, la version gratuite est largement suffisante. La version Pro est nécessaire quand les images sont sur un serveur tiers et que vous ne voulez pas les télécharger manuellement, ainsi que pour les champs ACF, l’import WooCommerce et le travail avec des types de contenu personnalisés.

Quelle méthode choisir pour votre projet

Si vous planifiez un import, assemblez la galerie à la volée via pmxi_gallery_image. Plus rapide, plus propre et sans double charge sur le serveur. L’une des trois variantes ci-dessus fonctionne: le choix dépend du format de galerie attendu par votre thème ou votre plugin.

Si les articles sont déjà en ligne et que les images sont dispersées dans le contenu, prenez la fonction qui remplace les <img> par [gallery] et lancez une mise à jour groupée. Pour de petits volumes (jusqu’à 200 articles), cela prendra quelques minutes. Pour des milliers d’articles, il est plus sage de fractionner par lots de 50.

WP All Import lui-même est l’un des importateurs les plus flexibles pour WordPress. Plus de 200 000 installations actives, la version gratuite sur WordPress.org couvre la plupart des tâches de migration. Et la version Pro lève les dernières limitations sur les URLs externes et les imports Cron. Essayez-la.