Obtener imágenes por URL de forma programática y guardarlas en la carpeta de subidas

18 mar 2011, 16:41:39
Vistas: 15.9K
Votos: 18

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

0
Todas las respuestas a la pregunta 2
4
35

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.

18 mar 2011 16:56:41
Comentarios

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.

Simon Blackbourn Simon Blackbourn
18 mar 2011 17:28:43

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

axel axel
15 sept 2014 12:18:16

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." } }

Marcello Perri Marcello Perri
12 jun 2023 16:45:31

@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.

John P Bloch John P Bloch
13 jun 2023 00:43:53
0

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

24 ago 2016 11:47:37