Como o WP media uploader cria as 3 imagens de tamanhos diferentes e como posso duplicá-las?

15

Eu finalmente tenho !! Tenho essa coisa que eu tentei 12 vezes para fazer e 12 maneiras diferentes, mas finalmente consegui que funcionasse, mais ou menos.

Eu fiz um metabox personalizado para enviar e anexar imagens a postagens, e isso não requer que você use o horrível media player de thickbox embutido no WP. Eu odeio essa coisa. Não, o que fiz foi apenas um grupo de entradas (título, descrição, arquivo), que você também pode duplicar, para adicionar anexos adicionais, se desejar. Então, você preenche os campos, seleciona uma imagem para fazer upload e salva o rascunho ou publica a postagem. Depois que houver anexos adicionados a uma postagem, o metabox exibirá os campos de entrada, junto com uma imagem de visualização da imagem anexada para cada anexo adicionado. Os campos title e description são usados para gerar os metadados do arquivo, nada é salvo como post_meta, que eu conheço. Atualmente, é tudo o que consegui até agora.

Preciso fazer com que, quando você salvar / publicar uma postagem, carregar / criar os arquivos anexos, ela crie os três tamanhos de imagem que o uploader padrão, miniatura, médio, grande e manter o conteúdo completo. tamanho de imagem também. Se isso for possível de alguma forma. Caso contrário, eu gostaria de usar add_image_size() para criar / definir novos tamanhos personalizados e gerá-los dessa maneira ao fazer o upload.

Não sei qual função é a mais ideal para usar neste caso, talvez a função image_make_intermediate_size() seja melhor ou wp_create_thumbnail() ou wp_crop_image() ... quem sabe !!

Eu não consigo descobrir como fazer isso, se eu precisar executar a função wp_handle_upload() para cada um, ou talvez algo envolvendo a função wp_generate_attachment_metadata() . É confuso para mim desde que os 3 tamanhos de imagem devem ser associados como variantes do mesmo anexo, e como fazer isso.

Eu vasculhei a web, li a origem de todos os arquivos relacionados ao wp media / upload / image e joguei com praticamente todas as funções do material de upload de mídia e não consegui encontrar como o WP cria os 3 tamanhos de imagem em qualquer lugar, ou como fazer isso sozinho.

Em wp-includes / media.php, a função image_resize() parece ser a melhor, já que é exatamente o que deveria ser. Eu simplesmente não consigo entender a vida de mim o que diabos eu estou sentindo falta ou tentei fazer, mas fiz de errado para fazer as miniaturas de imagens.

Aqui está minha função de trabalho que faz o wp_handle_upload() coisas e coisas, mas também precisa criar o thumb de 100px, e fazer uma versão de redimensionamento da imagem que é max-width como 500px, e salva como novos arquivos do carregou um.

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

Qualquer um capaz de me ajudar a consertar isso para que funcione corretamente seria amado. Passei tantas horas ridículas inúmeras vezes tentando desenvolver essa coisa e a documentação é uma droga, e realmente não há posts bons sobre como fazer isso.

Obrigado

    
por jaredwilli 30.01.2011 / 00:16

2 respostas

6

Oi @jaredwilli:

Cara! Esforço valente e bom trabalho. Tudo isso poderia ser um ótimo complemento para o WordPress.

Você estava tão perto, mas tinha entre 5 e 10 pequenas suposições ou códigos que pareciam ter começado, mas não voltaram porque não estava funcionando. Eu retrabalhei sua função apenas tanto quanto precisei corrigi-la. A solução segue, e eu vou deixar a comparação lado a lado para o seu ou alguém menos queimado. :)

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

Ei, por que não fazer alarde e obter uma cópia do PhpStorm ? Você poderia facilmente ter resolvido isso, você estava tão perto, se você pudesse apenas rastrear o código como eu posso agora. Se fizer isso, não perca tempo com o XDEBUG e, em vez disso, baixe Depurador do Zend .

P.S. Esta é minha resposta anterior. Eu postei isso antes de perceber o que exatamente Jared estava perguntando. Está correto, mas não está relacionado à sua pergunta. :)

Acho que o que você está procurando é add_image_size() :

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

Por exemplo:

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

Ao definir isso, o WordPress criará esses tamanhos automaticamente. O que você precisava?

    
por MikeSchinkel 30.01.2011 / 00:51
0

Se eu entendi a sua pergunta, você precisa primeiro obter a lista de tamanhos assim:

$image_sizes = get_intermediate_image_sizes();

isso retorna uma matriz de todos os tamanhos de imagem registrados (padrões: grande, médio, miniatura, qualquer tamanho personalizado registrado usando "add_image_size ()" então tudo o que você precisa fazer é percorrer cada um dos tamanhos e criar uma imagem para esse tamanho da seguinte forma:

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

substitua $ file pelo caminho do arquivo carregado e $ crop por verdadeiro ou falso se você quiser recortar a imagem para as novas dimensões ou falso para redimensionar.

    
por Bainternet 30.01.2011 / 01:45