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.