In che modo l'uploader multimediale WP crea le 3 immagini di dimensioni diverse e come posso duplicarle


17

Finalmente ho !! ho ottenuto questa cosa che ho provato circa 12 volte per fare e 12 modi diversi, ma alla fine l'ho fatto funzionare, ... in un certo senso.

Ho creato un metabox personalizzato per caricare e allegare immagini ai post e non è necessario utilizzare l'orribile uploader multimediale thickbox integrato in WP. Odio quella cosa. No, quello che ho fatto è solo un gruppo di input (titolo, descrizione, file), che puoi anche duplicare, per aggiungere ulteriori allegati se vuoi. Quindi compili i campi, selezioni un'immagine da caricare e salvi la bozza o pubblichi il post. Una volta aggiunti gli allegati a un post, metabox visualizzerà i campi di input, insieme a un'immagine di anteprima dell'immagine allegata per ogni allegato aggiunto. I campi del titolo e della descrizione vengono utilizzati per generare i metadati del file, nulla viene salvato come post_meta, di cui sono a conoscenza. Questo è attualmente tutto ciò che ho ottenuto lavorare finora.

Devo farlo in modo che quando salvi / pubblichi un post, intendi caricare / creare i file degli allegati, crei le tre dimensioni dell'immagine come farebbe l'uploader wp predefinito, miniatura, medio, grande e mantenendo anche l'immagine a dimensione intera . Se è possibile in qualche modo. In caso contrario, vorrei utilizzare altrimenti add_image_size()per creare / definire nuove dimensioni personalizzate e generarle in questo modo, al momento del caricamento.

Non sono sicuro di quale sia la funzione più ideale da utilizzare in questo caso, forse la image_make_intermediate_size()funzione sarebbe migliore o wp_create_thumbnail()o wp_crop_image()... chissà !!

Non riesco a capire come farlo, se devo eseguire la wp_handle_upload()funzione per ognuno o forse qualcosa che coinvolge la wp_generate_attachment_metadata()funzione. Mi confonde poiché le 3 dimensioni dell'immagine devono essere associate come varianti dello stesso allegato e come procedere.

Ho esplorato il Web, letto la fonte di ogni file relativo ai file multimediali di upload / upload / immagine e giocato con quasi tutte le funzioni disponibili per il caricamento dei file multimediali e non riesco a trovare il modo in cui WP crea le 3 dimensioni dell'immagine da nessuna parte, o come fare io stesso.

In wp-Includes / media.php la image_resize()funzione sembra che sarebbe meglio poiché è esattamente quello che dovrebbe essere. Non riesco proprio a capire per me la vita cosa diavolo mi manca o ho provato a fare ma ho sbagliato a realizzare le miniature delle immagini.

Ecco la mia funzione di lavoro che fa wp_handle_upload()cose e cose, ma ha anche bisogno di creare il pollice 100px e creare una versione ridimensionata dell'immagine della larghezza massima come 500px e salvata come nuovi file di quello caricato.

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

Chiunque fosse in grado di aiutarmi a risolvere questo problema in modo che funzioni correttamente sarebbe amato. Ho trascorso così tante ore ridicole innumerevoli volte diverse nel tentativo di sviluppare questa cosa e la documentazione fa schifo, e non ci sono davvero buoni post da nessuna parte su come farlo.

Grazie


Controlla i commenti sulle varie risposte di seguito e penso che io o @ בניית אתרים o entrambi siamo confusi su ciò di cui hai bisogno.
MikeSchinkel,

Qualcuno ha risolto questo ?? Avendo un problema simile, ho spaventato il web per secoli su questo.

Risposte:


6

Ciao @jaredwilli:

Tipo! Sforzo valoroso e bel lavoro. Tutto sommato potrebbe essere un'ottima aggiunta a WordPress.

Eri così vicino, ma avevi da qualche parte tra 5 e 10 ipotesi non riuscite o codice che sembra che tu l'abbia iniziato ma non ci sei tornato perché non funzionava. Ho rielaborato la tua funzione solo quanto necessario per correggerla. La soluzione segue e lascerò il confronto fianco a fianco con il tuo o qualcuno meno bruciato. :)

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

Ehi, perché non sfoggiare e procurarti una copia di PhpStorm ? Avresti potuto facilmente risolverlo da solo, eri così vicino, se avessi potuto tracciare il codice come faccio ora. Se lo fai, non perdere tempo con il buggy XDEBUG e scarica invece Zend Debugger .

PS Questa è la mia precedente risposta. L'ho postato prima di rendermi conto di cosa esattamente stava chiedendo Jared. È corretto, ma non correlato alla sua domanda. :)


Penso che quello che stai cercando sia add_image_size():

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

Per esempio:

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

Impostando questo WordPress creerà automaticamente quelle dimensioni. Di cosa hai bisogno?


Non ne sono sicuro, sta chiedendo la creazione delle dimensioni dei supporti predefinite.
Bainternet,

Hmm. La funzione lo wp_generate_attachment_metadata()fa se add_image_size()è impostato. Forse non ha provato a usare add_image_size()per impostare le dimensioni dell'immagine?
MikeSchinkel,

sì, ma jaredwilli sta dicendo che non sono state create le dimensioni predefinite predefinite di WordPress (grande, medio, miniatura), quindi sicuramente non saranno create nemmeno le dimensioni aggiuntive aggiunte usando add_image_size ().
Bainternet,

o forse non capisco affatto la domanda :)
Bainternet,

@ בניית אתרים - Anche adesso mi sto confondendo. Penso che dobbiamo aspettare qui chiarimenti da @jaredwilli.
MikeSchinkel,

0

se capisco la tua domanda devi prima ottenere l'elenco delle taglie in questo modo:

$image_sizes = get_intermediate_image_sizes();

questo restituisce un array di tutte le dimensioni di immagine registrate (valori predefiniti: grande, medio, miniatura, qualsiasi dimensione personalizzata registrata usando "add_image_size ()", quindi tutto ciò che devi fare è passare in rassegna ognuna delle dimensioni e creare un'immagine per quella dimensione come Questo:

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

sostituire $ file con il percorso del file caricato e $ crop con true o false se si desidera ritagliare l'immagine nelle nuove dimensioni o false per ridimensionare.


@ בניית אתרים - Se dai un'occhiata al codice per wp_generate_attachment_metadata()in /wp-admin/includes/image.php, vedrai che fa esattamente quello che hai postato sopra, e lo ha già chiamato. Quindi se quelli non vengono creati, forse ha un plugin che li filtra usando l' 'intermediate_image_sizes_advanced'hook?
MikeSchinkel,

In realtà non avevo provato a usare get_intermediate_image_sizes (); Non sapevo che avesse tutte le dimensioni registrate. Che è bello sapere ora. Non riesco ancora a capire come le dimensioni delle immagini generate siano associate a un particolare allegato, tuttavia, come se dovessi guardare nella libreria multimediale, vedi le 3 opzioni di dimensioni, quando selezioni una di queste, sa quale immagine prendere . Idk, non è così importante. A meno che non lo sia. Dopo aver fatto quel ciclo foreach quale variabile dovrei usare per aggiungere l'allegato? $ images ['thumb'] o qualcosa del genere (qualunque dimensione io voglia)?
jaredwilli,

@ בניית אתרים - Inizialmente entrambi abbiamo perso il vero problema. Il vero problema era circa 7 o 8 errori di codice nell'esempio originale. Vedi la mia risposta aggiornata.
MikeSchinkel,

Sì, era tardi ed ero morto di cervello.
Bainternet,

@ בניית אתרים - Same. :)
MikeSchinkel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.