Como o WP media Uploader cria as três imagens de tamanhos diferentes e como posso duplicá-la


17

Eu finalmente !! tentei fazer 12 vezes e 12 maneiras diferentes, mas finalmente consegui funcionar ... mais ou menos.

Criei uma metabox personalizada para carregar e anexar imagens a postagens, e isso não exige que você use o horrível uploader de mídia thickbox incorporado ao 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, preencha os campos, selecione uma imagem para carregar e salve o rascunho ou publique a postagem. Quando houver anexos adicionados a uma postagem, a metabox exibirá os campos de entrada, juntamente com uma imagem de visualização da imagem anexada para cada anexo adicionado. Os campos de título e descrição são usados ​​para gerar os metadados do arquivo, nada é salvo como o post_meta, que eu conheço. Atualmente, é tudo o que consegui trabalhar até agora.

Eu preciso fazer isso para que, quando você salvar / publicar uma postagem, ativar o upload / criar os arquivos de anexo, ele criará os três tamanhos de imagem que o uploader wp padrão faria, como miniatura, média, grande e manter a imagem em tamanho real também . Se isso é 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 tenho certeza de qual função é a mais ideal para usar neste caso, talvez a image_make_intermediate_size()função seja melhor, ou wp_create_thumbnail()ou wp_crop_image()... quem sabe !!

Não consigo descobrir como fazer isso, se precisar executar a wp_handle_upload()função para cada um, ou talvez algo que envolva a wp_generate_attachment_metadata()função. É confuso para mim, já que os três tamanhos de imagem devem ser associados como variantes do mesmo anexo, e como fazer isso.

Vasculhei a Web, li a fonte de todos os arquivos relacionados a mídia / upload / imagem wp e reproduzi quase todas as funções disponíveis para o material de upload de mídia e não consigo encontrar como o WP cria os três tamanhos de imagem em qualquer lugar ou como fazer sou eu mesmo.

No wp-includes / media.php, a image_resize()função parece ser melhor, pois é exatamente o que deveria ser. Simplesmente não consigo descobrir pela minha vida o que diabos estou sentindo falta ou tentei fazer, mas fiz de errado para fazer as miniaturas das imagens.

Aqui está minha função de trabalho que faz wp_handle_upload()tudo, mas também precisa criar o polegar de 100px e fazer uma versão de redimensionamento da imagem com largura máxima de 500px e salva como novos arquivos da que foi carregada.

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 pessoa capaz de me ajudar a finalmente corrigir isso para que funcione corretamente seria amada. Passei tantas horas ridículas e incontáveis ​​inúmeras vezes tentando desenvolver essa coisa, e a documentação é péssima, e não há realmente boas postagens sobre como fazê-lo.

obrigado


Verifique os comentários nas várias respostas abaixo e acho que eu ou o @ בניית אתרים ou nós dois estamos confusos sobre o que você precisa.
precisa saber é o seguinte

Alguém resolveu isso? Tendo um problema semelhante, há muitos anos que escarnecemos da web.

Respostas:


6

Oi @jaredwilli:

Cara! Esforço valioso e bom trabalho. Em suma, pode ser um ótimo complemento para o WordPress.

Você estava tão perto, mas tinha entre 5 e 10 pequenas suposições ou códigos com falha, que parecem ter iniciado, mas não voltaram a ele porque não estava funcionando. Eu reformulei sua função apenas o necessário para corrigi-la. A solução segue e deixarei a comparação lado a lado com você ou com alguém menos esgotado. :)

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 conseguir uma cópia do PhpStorm ? Você poderia ter resolvido isso facilmente, você estava muito perto, se você pudesse apenas traçar o código como eu agora posso. Se o fizer, não perca seu tempo com o XDEBUG com muitos erros e faça o download Zend Debugger .

PS Esta é a minha resposta anterior. Publiquei isso antes de perceber o que exatamente Jared estava perguntando. Está correto, mas não relacionado à sua pergunta. :)


Eu 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 este WordPress, esses tamanhos serão criados automaticamente. O que você precisa?


Não tenho certeza disso, ele está pedindo a criação dos tamanhos de mídia padrão.
Bainternet

Hmm. A função wp_generate_attachment_metadata()faz isso se add_image_size()estiver definida. Talvez ele simplesmente não tenha tentado usar add_image_size()para definir o tamanho da imagem?
precisa saber é o seguinte

sim, mas jaredwilli está dizendo que os tamanhos padrão do WordPress embutidos (grande, médio, miniatura) não estão sendo criados, então os tamanhos adicionais adicionados usando add_image_size () também não serão criados.
Bainternet

ou talvez eu não estou recebendo a questão em todos os :)
Bainternet

@ בניית אתרים - Estou ficando confuso agora também. Acho que precisamos esperar aqui esclarecimentos de @jaredwilli.
precisa saber é o seguinte

0

se eu entendi sua pergunta, você precisa obter a lista de tamanhos primeiro 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 ()" ", basta fazer um loop entre cada um dos tamanhos e criar uma imagem para esse tamanho, como esta:

$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 true ou false se desejar cortar a imagem para as novas dimensões ou false para redimensionar.


@ בניית אתרים - Se você der uma olhada no código para wp_generate_attachment_metadata()em /wp-admin/includes/image.phpvocê verá que ele faz exatamente o que você postou acima, e ele já é chamado assim. Então, se eles não estão sendo criados, talvez ele tenha um plugin que os filtre usando o 'intermediate_image_sizes_advanced'gancho?
precisa saber é o seguinte

Na verdade, eu não tinha tentado usar get_intermediate_image_sizes (); Eu não sabia que tinha todos os tamanhos registrados. O que é bom saber agora. Ainda não entendi direito como os tamanhos de imagem gerados estão associados a um anexo específico. Como se eu fosse procurar na biblioteca de mídia, você vê as três opções de tamanho. Ao selecionar um deles, ele sabe qual imagem pegar . Idk, isso não é tão importante. A menos que seja. Depois de fazer esse loop foreach, que variável eu usaria para adicionar o anexo? $ images ['thumb'] ou algo assim (qualquer tamanho que eu quiser)?
precisa saber é o seguinte

@ בניית אתרים - Nós dois perdemos o verdadeiro problema a princípio. O problema real era cerca de 7 ou 8 erros de código no exemplo original. Veja minha resposta atualizada.
MikeSchinkel

Sim, era tarde aqui e eu estava com morte cerebral.
Bainternet 30/01

@ בניית אתרים - Mesmo. :)
MikeSchinkel 30/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.