¿Cómo crea WP media uploader las 3 imágenes de diferentes tamaños y cómo puedo duplicarlas?

15

Por fin tengo !! tengo esta cosa que he intentado unas 12 veces para hacer y 12 formas diferentes, pero finalmente lo hice funcionar, ... más o menos.

Hice un metabox personalizado para cargar y adjuntar imágenes a las publicaciones, y no es necesario que utilices el horrible cargador de medios de datos integrado en WP. Odio esa cosa. No, lo que he hecho es solo un grupo de entradas (título, descripción, archivo), que también puede duplicar, para agregar archivos adjuntos adicionales si lo desea. Así que rellena los campos, selecciona una imagen para cargar y guarda el borrador o publica la publicación. Una vez que se agreguen adjuntos a una publicación, el metabox mostrará los campos de entrada, junto con una imagen de vista previa de la imagen adjunta para cada adjunto que haya agregado. Los campos de título y descripción se utilizan para generar los metadatos del archivo, nada se guarda como post_meta, que yo sepa. Eso es todo lo que he conseguido trabajando hasta ahora.

Necesito hacerlo para que cuando guarde / publique una publicación, ingrese y cargue los archivos adjuntos, se crearán los tres tamaños de imagen como lo haría el cargador de wp predeterminado, miniatura, medio, grande y manteniendo la totalidad. tamaño de la imagen también. Si eso es posible de alguna manera. De lo contrario, me gustaría usar add_image_size() para crear / definir nuevos tamaños personalizados, y generarlos de esa manera, al cargarlos.

No estoy seguro de qué función es la más ideal para usar en este caso, tal vez la función image_make_intermediate_size() sería mejor, o wp_create_thumbnail() o wp_crop_image() ... ¡¡quién sabe !!

No puedo averiguar cómo hacer eso, si necesito ejecutar la función wp_handle_upload() para cada una, o tal vez algo relacionado con la función wp_generate_attachment_metadata() . Para mí es confuso, ya que los 3 tamaños de imagen deben asociarse como variantes del mismo archivo adjunto, y cómo hacerlo.

He rastreado la web, he leído la fuente de cada archivo wp media / upload / image, y he jugado con casi todas las funciones disponibles para la carga de medios y no puedo encontrar cómo WP crea los 3 tamaños de imagen en cualquier lugar, o cómo hacerlo yo mismo.

En wp-includes / media.php, la función image_resize() parece que sería lo mejor, ya que es exactamente lo que debería ser. Simplemente no puedo entender por la vida de mí qué demonios me falta o he intentado hacer, pero hice mal para hacer las miniaturas de las imágenes.

Aquí está mi función de trabajo que hace el wp_handle_upload() cosas y cosas, pero también necesita crear el pulgar de 100px, y hacer una versión de tamaño de la imagen que tenga un ancho máximo de 500px, y se guarde como nuevos archivos del subido uno.

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

Cualquier persona que pueda ayudarme finalmente solucionará esto para que funcione correctamente sería amada. He pasado tantas horas ridículas e innumerables veces intentando desarrollar esto y la documentación apesta, y realmente no hay ninguna buena publicación en ningún lugar sobre cómo hacerlo.

Gracias

    
pregunta jaredwilli 30.01.2011 - 00:16

2 respuestas

6

Hola @jaredwilli:

¡Amigo! Esfuerzo valiente, y buen trabajo. En general, podría ser una gran adición a WordPress.

Estuviste tan cerca, pero tenías entre 5 y 10 suposiciones o códigos fallidos que parecían haberlo iniciado pero no habías vuelto porque no funcionaba. Reelaboré tu función solo tanto como necesitaba para corregirla. La solución sigue, y dejaré la comparación de lado a lado a usted oa alguien menos agotado. :)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

Oye, ¿por qué no derrochar y obtener una copia de PhpStorm ? Podrías haberlo resuelto fácilmente por ti mismo, estabas tan cerca, si hubieras podido simplemente rastrear el código como yo ahora puedo. Si lo hace, no pierda su tiempo en el XDEBUG y descargue Zend Debugger .

P.S. Esta es mi respuesta anterior. Publiqué esto antes de darme cuenta de lo que exactamente estaba preguntando Jared. Es correcto, pero no relacionado con su pregunta. :)

Creo que lo que estás buscando es add_image_size() :

add_image_size( $size_id, $width, $height, $crop );

Por ejemplo:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

Al establecer este WordPress creará esos tamaños automáticamente. ¿Qué es lo que necesitabas?

    
respondido por el MikeSchinkel 30.01.2011 - 00:51
0

Si entiendo su pregunta, necesita obtener primero la lista de tamaños como esta:

$image_sizes = get_intermediate_image_sizes();

esto devuelve una matriz de todos los tamaños de imagen registrados (predeterminados: grande, mediano, miniatura, cualquier tamaño personalizado registrado usando "add_image_size ()" luego, todo lo que tiene que hacer es recorrer cada uno de los tamaños y crear una imagen para ese tamaño:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

reemplace $ file con la ruta del archivo cargado y $ crop con true o false si desea recortar la imagen a las nuevas dimensiones o false para cambiar el tamaño.

    
respondido por el Bainternet 30.01.2011 - 01:45

Lea otras preguntas en las etiquetas