Obtener imágenes por URL de forma programática y guardarlas en la carpeta de subidas
Estoy involucrado en una gran migración desde otro CMS a WordPress. Tenemos una copia de la base de datos y hemos resuelto cómo extraer el contenido y crear posts de WordPress programáticamente usando una instancia de la clase wpdb
.
Sin embargo, hay un par de miles de imágenes que nos gustaría transferir automáticamente, generar los distintos tamaños y luego adjuntar a los posts, para ahorrar aproximadamente una semana de trabajo.
¿Existe alguna forma de obtener una imagen desde un sitio remoto por URL y guardarla en mi carpeta wp-uploads? Supongo que esto usa wp_http
pero no estoy familiarizado con eso.
Una vez que tenga la imagen y la haya guardado estaré bien, ya que luego puedo usar wp_generate_attachment_metadata
para crear los distintos tamaños y wp_insert_attachment
para adjuntarla a un post.
Gracias Simon

De hecho, existe una función excelente que hará esas tres cosas por ti:
media_sideload_image( $url, $post_id, $description );
El primer argumento es la URL remota de la imagen que deseas descargar. El segundo argumento es el ID de la publicación a la que quieres adjuntar la imagen. El tercer argumento es opcional, pero si se incluye será una descripción.
Sugeriría encontrar una manera de controlar las descargas para no saturar el tiempo de espera, como limitar la cantidad de imágenes que se importan por carga y configurar el importador para que se actualice entre descargas, o usar AJAX para hacerlas de una en una de forma asíncrona.

eso es absolutamente fantástico john, muchas gracias - funciona perfectamente. el límite de velocidad no es un problema ya que lo he configurado para esperar una pulsación de tecla después de cada importación de publicación para darnos la oportunidad de verificar manualmente los detalles y anotar los problemáticos.

solo porque necesitaba el ID del adjunto para conectarlo a otra publicación, aquí hay una buena manera de hacerlo

Esto funciona muy bien, pero ¿podemos hacer lo mismo con un archivo que no sea una imagen? Con un PDF por ejemplo. Si intento ejecutar la misma función con un PDF obtengo este mensaje de error: array(1) { ["image_sideload_failed"]=> array(1) { [0]=> string(18) "Invalid image URL." } }

@MarcelloPerri la forma más rápida de hacer eso sería agregar las extensiones de archivo que necesitas al filtro para la función sideload antes de ejecutar la función sideload: add_filter( 'image_sideload_extensions', fn( $exts ) => array_merge( $exts, [ 'pdf' ] ) );
. Por lo que puedo ver, no hay nada en la función que requiera que los archivos sean imágenes.

La respuesta de John es correcta respecto al uso de media_sideload_image
, solo ten en cuenta que posiblemente necesites requerir estos scripts primero si no estás haciendo esto dentro del contexto de WP Admin:
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
Consulta https://codex.wordpress.org/Function_Reference/media_sideload_image#Notes
