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

17

Por fin tengo !! Tengo esta cosa que he intentado hacer 12 veces y 12 maneras 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 requiere que uses el horrible cargador de medios de caja gruesa 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. Por lo tanto, complete los campos, seleccione una imagen para cargar y guarde el borrador o publique la publicación. Una vez que hay archivos adjuntos agregados a una publicación, el metabox mostrará los campos de entrada, junto con una imagen de vista previa de la imagen adjunta para cada archivo adjunto que haya agregado. Los campos de título y descripción se utilizan para generar los metadatos del archivo, nada que se guarde como post_meta, que yo sepa. Eso es todo lo que he trabajado hasta ahora.

Necesito hacerlo para que cuando guarde / publique una publicación, cargue / cree los archivos adjuntos, creará los tres tamaños de imagen como lo haría el cargador de wp predeterminado, miniatura, mediano, grande y manteniendo la imagen de tamaño completo 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 subirlos.

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

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

Recorrí la web, leí la fuente de todos los archivos relacionados con wp media / upload / image, y jugué con casi todas las funciones que hay para la carga de medios y no puedo encontrar cómo WP crea los 3 tamaños de imagen en ningún lado, o cómo hacerlo yo mismo.

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

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

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'] );
  }
}

Alguien capaz de ayudarme finalmente a solucionar esto para que funcione correctamente sería amado. He pasado tantas horas ridículas innumerables numerosas veces diferentes tratando de desarrollar esto y la documentación es una mierda, y realmente no hay buenas publicaciones en ninguna parte sobre cómo hacerlo.

Gracias

jaredwilli
fuente
Compruebe los comentarios sobre las diversas respuestas a continuación y yo creo que cualquiera o @ בניית אתרים o ambos de nosotros están confundidos sobre lo que necesita.
MikeSchinkel
¿Alguien ha resuelto esto? Al tener un problema similar, he estado revisando la web durante siglos en este caso.

Respuestas:

6

Hola @jaredwilli:

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

Estuviste tan cerca, pero tenías entre 5 y 10 pequeñas suposiciones fallidas o código que parece que lo comenzaste pero no volviste a hacerlo porque no estaba funcionando. Modifiqué su función solo lo que necesitaba para corregirla. La solución sigue, y dejaré la comparación lado a lado a usted o 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 tú mismo, estabas tan cerca, si hubieras podido rastrear el código como ahora. Si lo hace, no pierda su tiempo en el XDEBUG con errores y descargue Zend Debugger .

PD: Esta es mi respuesta anterior. Publiqué esto antes de darme cuenta de lo que Jared estaba preguntando exactamente. Es correcto, pero no está 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 configurar esto, WordPress creará esos tamaños automáticamente. ¿Qué es lo que necesitabas?

MikeSchinkel
fuente
No estoy seguro de eso, está pidiendo la creación de los tamaños de medios predeterminados.
Bainternet
Hmm La función wp_generate_attachment_metadata()hace eso si add_image_size()está configurado. ¿Tal vez simplemente no intentó usar add_image_size()para establecer los tamaños de imagen?
MikeSchinkel
sí, pero jaredwilli dice que no se están creando los tamaños predeterminados incorporados de WordPress (grande, mediano, miniatura), entonces tampoco se crearán los tamaños adicionales agregados usando add_image_size ().
Bainternet
o tal vez no estoy recibiendo la pregunta en absoluto :)
Bainternet
@ בניית אתרים - Ahora me estoy confundiendo también. Creo que debemos esperar hasta aquí una aclaración de @jaredwilli.
MikeSchinkel
0

si entiendo tu pregunta, primero debes obtener 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 (valores 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 como esta:

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

Bainternet
fuente
@ בניית אתרים - Si se echa un vistazo en el código para wp_generate_attachment_metadata()en /wp-admin/includes/image.phpverá que hace exactamente lo que envió por encima, y ya que se llama. Entonces, si no se están creando, ¿tal vez tenga un complemento que los filtre usando el 'intermediate_image_sizes_advanced'gancho?
MikeSchinkel
En realidad no había intentado usar get_intermediate_image_sizes (); No sabía que tenía todos los tamaños registrados. Lo cual es bueno saber ahora. Sin embargo, todavía no entiendo cómo los tamaños de imagen generados están asociados con un archivo adjunto en particular, como si fuera a buscar en la biblioteca de medios, verá las 3 opciones de tamaño, al seleccionar una de ellas, sabe qué imagen tomar . Idk, eso no es tan importante. A menos que sea. Después de hacer ese ciclo foreach, ¿qué variable usaría para agregar el archivo adjunto? $ images ['pulgar'] o algo (cualquier tamaño que quiera)?
jaredwilli
@ בניית אתרים - Ambos nos perdimos el verdadero problema al principio. El verdadero problema era sobre unos 7 u 8 errores de código en el ejemplo original. Ver mi respuesta actualizada.
MikeSchinkel
Sí, era tarde aquí y tenía muerte cerebral.
Bainternet
@ בניית אתרים - Igual. :)
MikeSchinkel