Descargue la imagen de la URL y cárguela en la biblioteca de medios de WordPress

4 minutos de lectura

Estoy tratando de crear una función de WordPress que tome una URL de imagen, descargue la imagen, la cargue en la biblioteca de medios y devuelva la identificación de la imagen.

lo adapte de esta respuesta que era tomado de aquíy agregué wp_insertar_archivo adjunto() al final.

De momento no funciona porque no devuelve nada ni sube ningún medio.

Me cansé de depurar paso a paso con var_dump()y he descubierto la $url El parámetro se pasa correctamente, pero no se emite nada desde download_url.

¿Sabes lo que está mal?

¿Puedes ver algo más en la función que podría estar rota?

/* Add image to media library from URL and return the new image ID */
function bg_image_upload($url) {

  // Gives us access to the download_url() and wp_handle_sideload() functions
  require_once( ABSPATH . 'wp-admin/includes/file.php' );

  // Download file to temp dir
  $timeout_seconds = 10;
  $temp_file = download_url( $url, $timeout_seconds );

  if ( !is_wp_error( $temp_file ) ) {

      // Array based on $_FILE as seen in PHP file uploads
      $file = array(
          'name'     => basename($url), // ex: wp-header-logo.png
          'type'     => 'image/png',
          'tmp_name' => $temp_file,
          'error'    => 0,
          'size'     => filesize($temp_file),
      );

      $overrides = array(
          // Tells WordPress to not look for the POST form
          // fields that would normally be present as
          // we downloaded the file from a remote server, so there
          // will be no form fields
          // Default is true
          'test_form' => false,

          // Setting this to false lets WordPress allow empty files, not recommended
          // Default is true
          'test_size' => true,
      );

      // Move the temporary file into the uploads directory
      $results = wp_handle_sideload( $file, $overrides );

      if ( !empty( $results['error'] ) ) {
          // Insert any error handling here
      } else {

          $filename  = $results['file']; // Full path to the file
          $local_url = $results['url'];  // URL to the file in the uploads dir
          $type = $results['type']; // MIME type of the file
          $wp_upload_dir = wp_upload_dir(); // Get the path to the upload directory.

          $attachment = array (
            'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
            'post_mime_type' => $type,
            'post_status' => 'inherit',
            'post_content' => '',
          );

          $img_id = wp_insert_attachment( $attachment, $filename  );

          return $img_id;
      }
  }
}

  • ¿Has revisado los registros del servidor web? Es posible que deba habilitar la depuración en PHP y ver si eso le da algunas pistas.

    – sal

    13 de octubre de 2018 a las 4:14

  • @sal acaba de revisar los registros de errores, pero están vacíos

    – TinyTiger

    13 de octubre de 2018 a las 4:34

  • verifique el registro de su servidor web. /var/logs/nginx/error_log para nginx por ejemplo.

    – gabriel

    13 de octubre de 2018 a las 5:29


  • ¡Hubo un error! Simplemente no lo tenía encendido antes. esta mostrando PHP Fatal error: Uncaught Error: Call to undefined function wp_generate_password() pero no estoy seguro de por qué ya que nunca llamé así. Aquí está el texto completo del error: pastebin.com/kf68j5YE

    – TinyTiger

    13 de octubre de 2018 a las 11:28


  • Lo primero que me viene a la mente es que tal vez la función no esté conectada correctamente dentro de WP: mira este artículo. Lo siento, pero aunque entiendo WP, no es mi pan y mantequilla. Espero que esto ayude de todos modos 🙂

    – sal

    14/10/2018 a las 19:35

100% trabajando este código

include_once( ABSPATH . 'wp-admin/includes/image.php' );
$imageurl="<IMAGE URL>";
$imagetype = end(explode("https://stackoverflow.com/", getimagesize($imageurl)['mime']));
$uniq_name = date('dmY').''.(int) microtime(true); 
$filename = $uniq_name.'.'.$imagetype;

$uploaddir = wp_upload_dir();
$uploadfile = $uploaddir['path'] . "https://stackoverflow.com/" . $filename;
$contents= file_get_contents($imageurl);
$savefile = fopen($uploadfile, 'w');
fwrite($savefile, $contents);
fclose($savefile);

$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => $filename,
    'post_content' => '',
    'post_status' => 'inherit'
);

$attach_id = wp_insert_attachment( $attachment, $uploadfile );
$imagenew = get_post( $attach_id );
$fullsizepath = get_attached_file( $imagenew->ID );
$attach_data = wp_generate_attachment_metadata( $attach_id, $fullsizepath );
wp_update_attachment_metadata( $attach_id, $attach_data ); 

echo $attach_id;

  • Esto funcionó para mí para cargar una imagen desde una URL y agregarla a la biblioteca de medios

    – deflimar

    9 de abril de 2020 a las 23:06

  • Coloqué este código como img.php en mi carpeta raíz y da un error. Advertencia: include_once(ABSPATH/wp-admin/includes/image.php): no se pudo abrir la transmisión: no existe tal archivo o directorio en

    – Ravi

    27 de abril de 2020 a las 7:30

Código actualizado: cree cualquier archivo en el directorio raíz de su sitio web. y agregue el siguiente código. cambiar IMAGEURL con cualquier url de imagen.

<?php 
include( 'wp-load.php' );
include_once( ABSPATH . '/wp-admin/includes/image.php' );

$imageurl="IMAGEURL";
$imagetype = end(explode("https://stackoverflow.com/", getimagesize($imageurl)['mime']));
$uniq_name = date('dmY').''.(int) microtime(true); 
$filename = $uniq_name.'.'.$imagetype;

$uploaddir = wp_upload_dir();
$uploadfile = $uploaddir['path'] . "https://stackoverflow.com/" . $filename;
$contents= file_get_contents($imageurl);
$savefile = fopen($uploadfile, 'w');
fwrite($savefile, $contents);
fclose($savefile);

$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => $filename,
    'post_content' => '',
    'post_status' => 'inherit'
);

$attach_id = wp_insert_attachment( $attachment, $uploadfile );
$imagenew = get_post( $attach_id );
$fullsizepath = get_attached_file( $imagenew->ID );
$attach_data = wp_generate_attachment_metadata( $attach_id, $fullsizepath );
wp_update_attachment_metadata( $attach_id, $attach_data ); 

echo $attach_id;
 ?>

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad