Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🔧 WP All Import: cómo reunir todas las imágenes de la entrada en una sola galería

🔧 WP All Import: cómo reunir todas las imágenes de la entrada en una sola galería

Importé cien publicaciones mediante WP All Import y las imágenes quedaron dispersas por el contenido de forma aleatoria: estiradas a ancho completo en algunos lugares, apretadas contra el texto en otros y colgando como enlaces rotos en el resto. Revisar cada publicación manualmente es una tarde perdida.

Existe una forma de reunir todo en una sola galería. Automáticamente, sin editar el contenido a mano. El método funciona tanto para importaciones nuevas como para publicaciones subidas hace un mes. A continuación, dos enfoques: el sencillo (sobre la marcha, mediante el hook pmxi_gallery_image) y el post-factum (con actualización masiva). Ambos probados en WP All Import 4.9+.

💡 Resumen rápido:

  • Prepare CSV o XML: enlaces de imagen como URL completas, una por línea
  • En la plantilla de importación, configure la sección Imágenes y especifique el campo con las imágenes
  • Añada el hook pmxi_gallery_image a functions.php, la galería se ensambla sola durante la importación
  • Para publicaciones antiguas: una función que reemplaza <img> por el shortcode de galería y actualización masiva

Cómo preparar las imágenes para la importación

Antes de ejecutar la importación, los enlaces de imagen deben tener el formato correcto. WP All Import descarga imágenes solo si la URL es completa, directa y apunta a un archivo, no a una página HTML.

Supongamos que en el sitio antiguo la galería tiene este aspecto:

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>

Tras el parseo, en el archivo CSV para la importación, los enlaces deben convertirse en URL completas, una por línea, sin envoltura HTML:

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

Donde http://newsite.com es el dominio del sitio al que está importando. Crítico: si los enlaces son relativos o apuntan al dominio antiguo, WP All Import no recogerá los archivos y no los subirá a la biblioteca de medios.

Los enlaces en el cuerpo de la publicación deben coincidir uno a uno con los que le proporciona al plugin para la subida. De lo contrario, tras la importación, algunas etiquetas <img> conservarán las URL antiguas y no se incluirán en la galería.

Configuración de la plantilla de importación en WP All Import

En la interfaz del plugin, vaya a la plantilla de importación. La sección principal aquí es Imágenes. Tiene este aspecto:

Interfaz de configuración de imágenes de WP All Import

En la sección Imágenes, especifique el campo que contiene los enlaces de imagen. Normalmente es una celda CSV separada (por ejemplo, gallery_images), donde los enlaces se listan con un separador, por defecto |:

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

WP All Import analizará la cadena, descargará cada imagen y la añadirá a la biblioteca de medios de WordPress. Pero por ahora las imágenes solo quedan adjuntas a la publicación como archivos adjuntos. La galería la ensamblaremos por separado.

Asegúrese de comprobar cómo maneja el plugin la subida. Haga clic en Vista previa y prueba, luego en Ejecutar prueba. Una marca verde junto al número de imágenes significa que todo está configurado correctamente. Una cruz roja significa que debe revisar las URL: deben ser completas y directas.

Antes de iniciar la importación, suba los archivos de imagen a la carpeta files en la raíz del sitio, si el plugin toma las imágenes del servidor y no de URL externas.

Cómo ensamblar la galería sobre la marcha: hook pmxi_gallery_image

La forma más limpia es ensamblar la galería justo durante la importación. WP All Import proporciona el hook pmxi_gallery_image, que se dispara por cada imagen subida. Usted intercepta el ID del adjunto y lo guarda en el campo meta de la publicación en el formato deseado.

Tres variantes probadas, elija según su tema o plugin de galería.

Variante 1: array de IDs de adjunto. Adecuada para la mayoría de temas que esperan la galería como un array de IDs de adjunto:

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: array de URL. Si el tema necesita enlaces directos a las imágenes a tamaño completo:

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: cadena con separador. Si el campo meta almacena IDs separados por coma (formato "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);

El código se inserta en el functions.php del tema. Una vez completada la importación, el hook puede eliminarse, el campo meta ya está poblado. Ventaja de este método: la galería está lista inmediatamente después de la importación, sin pasadas adicionales.

Qué hacer con las publicaciones ya importadas

Si las publicaciones ya están subidas y las imágenes cuelgan en el contenido como etiquetas <img> normales, necesita un enfoque diferente. Recorra todas las publicaciones y reemplace las etiquetas por el shortcode de galería.

La función a continuación recopila todos los IDs de adjunto de una publicación y reemplaza <img> en el contenido por [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}

Luego ejecute una actualización masiva:

  • En el panel de administración, vaya a la lista de todas las publicaciones.
  • En las opciones de pantalla, establezca el número de elementos en 50 (óptimo para que el servidor no colapse).
  • Seleccione todas las publicaciones, elija «Actualizar» en acciones en lote y aplique.

WordPress recorrerá cada publicación, llamará a save_post y los hooks relacionados. Si la función en functions.php está vinculada a save_post, se ejecutará. Una vez completado, **elimine el código de **functions.php, de lo contrario, con cada guardado de publicación, el contenido se reconstruirá de nuevo.

⁉️🤔 Preguntas frecuentes

WP All Import** no descarga imágenes durante la importación, ¿qué falla?**

Los enlaces en el archivo de importación deben ser URL completas (con http:// o https://) y conducir directamente a un archivo de imagen, no a una página HTML. Verifique los permisos de escritura de wp-content/uploads: si el servidor no puede guardar el archivo, la importación de imágenes se omite silenciosamente. La razón más común es una falta de coincidencia entre los enlaces en el cuerpo del contenido y en el campo Imágenes de la plantilla. Si el contenido tiene http://oldsite.com/img.jpg y en Imágenes se proporciona http://newsite.com/files/img.jpg, el plugin no los vinculará y la imagen quedará rota. Las URL deben coincidir uno a uno.

¿Por qué pmxi_gallery_image es mejor que la post-importación?

El hook se dispara por cada imagen en el momento de la subida, la galería está lista justo después de la importación, sin una segunda pasada. La post-importación mediante wp_update_post carga el servidor: mil publicaciones generan mil llamadas a save_post. Para volúmenes de hasta 100 publicaciones, la diferencia es insignificante, pero para migraciones grandes, el hook ahorra horas. Además, pmxi_gallery_image da acceso a la ruta del archivo subido y al ID del adjunto, puede prescribir inmediatamente cualquier lógica: distribuir por carpetas, añadir al slider, sincronizar con CDN. La post-importación no ofrece esa flexibilidad.

¿Es necesario eliminar el código de functions.php después de la importación?

Sí. Si la función cuelga de pmxi_gallery_image, se dispara ante CUALQUIER adición de adjunto, el resultado: duplicados en el campo meta de la galería al subir imágenes manualmente. El hook se ejecuta una vez, una vez completada la importación, puede eliminarse sin problema. Si la función está vinculada a save_post o se usa en actualización masiva, con más razón elimínela. De lo contrario, cada edición de publicación reconstruirá el contenido, eliminando etiquetas <img> y reescribiendo la galería.

¿Cómo dejar imágenes individuales fuera de la galería?

Exclúyalas del reemplazo. En la variante con pmxi_gallery_image, añada una condición por tamaño o texto alternativo. En la variante con post-importación, en lugar de preg_replace para todos los <img>, use reemplazo selectivo: deje las imágenes con una clase CSS o atributo específico, elimine el resto y reemplace por galería. Por ejemplo, <img class="keep"> permanece en el contenido, todos los demás <img> se reemplazan por [gallery]. Se resuelve refinando la expresión regular en la función de reemplazo.

¿Es necesario WP All Import Pro o basta con la versión gratuita?

La versión gratuita puede importar imágenes a la biblioteca de medios y adjuntarlas a una publicación. El hook pmxi_gallery_image también está disponible en ella. La versión Pro añade: carga de imágenes desde URL externas, importaciones Cron programadas, ejecución de funciones PHP directamente en la plantilla de importación y soporte para campos personalizados. Para una importación única con archivos locales, la versión gratuita es más que suficiente. Pro es necesaria cuando las imágenes están en un servidor de terceros y no quiere descargarlas manualmente, así como para campos ACF, importación de WooCommerce y trabajo con tipos de publicación personalizados.

Qué método elegir para su tarea

Si está planificando una importación, ensamble la galería sobre la marcha mediante pmxi_gallery_image. Más rápido, más limpio y sin doble carga en el servidor. Cualquiera de las tres variantes anteriores funciona: la elección depende del formato en que su tema o plugin espere la galería.

Si las publicaciones ya están subidas y las imágenes están dispersas por el contenido, tome la función para reemplazar <img> por [gallery] y ejecute una actualización masiva. Para volúmenes pequeños (hasta 200 publicaciones), esto tomará un par de minutos. Para miles de publicaciones, es más sensato dividir en lotes de 50.

WP All Import en sí mismo es uno de los importadores más flexibles para WordPress. Más de 200 000 instalaciones activas, la versión gratuita en WordPress.org cubre la mayoría de las tareas de migración. Y la versión Pro elimina las últimas limitaciones sobre URL externas e importaciones Cron. Pruébelo.