Bagaimana cara pengunggah media WP membuat 3 gambar berukuran berbeda, dan bagaimana saya bisa menduplikasinya

17

Akhirnya aku !! mendapatkan hal ini Saya sudah mencoba sekitar 12 kali untuk membuat dan 12 cara yang berbeda, tetapi akhirnya berhasil, ... semacam.

Saya membuat metabox khusus untuk mengunggah dan melampirkan gambar ke posting, dan itu tidak mengharuskan Anda untuk menggunakan pengunggah media kotak tebal yang mengerikan yang dibangun ke dalam WP. Aku benci benda itu. Tidak, apa yang saya lakukan hanyalah sekelompok input (judul, deskripsi, file), yang juga dapat Anda tiru, untuk menambahkan lampiran tambahan jika Anda mau. Jadi, Anda mengisi kolom, pilih gambar untuk diunggah, dan menyimpan konsep atau menerbitkan posting. Setelah ada lampiran yang ditambahkan ke posting, metabox akan menampilkan bidang input, bersama dengan gambar pratinjau dari gambar terlampir untuk setiap lampiran yang Anda tambahkan. Bidang judul dan deskripsi digunakan untuk menghasilkan data meta file, tidak ada yang disimpan sebagai post_meta, yang saya tahu. Itulah semua yang saya dapatkan sejauh ini.

Saya perlu membuatnya sehingga ketika Anda menyimpan / mempublikasikan posting, mengunggah upload / membuat file lampiran, itu akan membuat tiga ukuran gambar seperti pengunggah wp default, thumbnail, menengah, besar, dan menjaga gambar ukuran penuh juga . Jika itu mungkin, entah bagaimana. Jika tidak, saya ingin menggunakannya add_image_size()untuk membuat / menentukan ukuran khusus baru, dan menghasilkannya seperti itu, setelah mengunggah.

Saya tidak yakin fungsi mana yang paling ideal untuk digunakan dalam kasus ini, mungkin image_make_intermediate_size()fungsinya akan lebih baik, atau wp_create_thumbnail()atau wp_crop_image()... siapa tahu !!

Saya tidak tahu bagaimana cara melakukan itu, jika saya perlu menjalankan wp_handle_upload()fungsi untuk masing-masing, atau mungkin sesuatu yang melibatkan wp_generate_attachment_metadata()fungsi. Ini membingungkan saya karena 3 ukuran gambar harus dikaitkan sebagai varian dari lampiran yang sama, dan bagaimana cara melakukannya.

Saya telah menjelajahi web, membaca sumber dari setiap media terkait file / upload / gambar wp, dan bermain dengan hampir setiap fungsi yang ada untuk hal-hal upload media dan tidak dapat menemukan bagaimana WP menciptakan 3 ukuran gambar di mana saja, atau bagaimana melakukan ini diriku.

Di wp-include / media.php image_resize()fungsinya terlihat seperti yang terbaik karena memang seharusnya demikian. Saya hanya tidak tahu apa yang saya lewatkan atau coba lakukan untuk kehidupan saya, tetapi salah membuat gambar mini.

Inilah fungsi kerja saya yang melakukan wp_handle_upload()hal - hal dan hal-hal, tetapi juga perlu membuat jempol 100px, dan membuat versi ukuran gambar yang maks-lebar seperti 500px, dan disimpan sebagai file baru dari yang diunggah.

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

Siapa pun yang dapat membantu saya akhirnya memperbaiki ini sehingga berfungsi dengan baik akan dicintai. Saya telah menghabiskan begitu banyak waktu yang tak terhitung jumlahnya dan berulang kali mencoba untuk mengembangkan hal ini dan dokumentasinya payah, dan tidak ada posting yang bagus di mana pun tentang bagaimana melakukannya.

Terima kasih

jaredwilli
sumber
Periksa komentar pada berbagai jawaban di bawah ini dan saya pikir saya atau @ בניית אתרים atau kami berdua bingung pada apa yang Anda butuhkan.
MikeSchinkel
Adakah yang memecahkan ini ?? Memiliki masalah yang serupa, sudah lama meneliti web untuk yang satu ini.

Jawaban:

6

Hai @jaredwilli:

Kawan! Upaya berani, dan kerja bagus. Secara keseluruhan itu bisa menjadi tambahan yang bagus untuk WordPress.

Anda sangat dekat, tetapi Anda memiliki sekitar 5 dan 10 asumsi atau kode gagal yang tampaknya Anda memulainya tetapi tidak kembali ke sana karena tidak berfungsi. Saya ulang fungsi Anda hanya sebanyak yang saya butuhkan untuk memperbaikinya. Solusinya berikut, dan saya akan meninggalkan perbandingan berdampingan dengan Anda atau seseorang yang kurang kelelahan. :)

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

Hei, mengapa tidak berbelanja secara Royal dan dapatkan sendiri salinan PhpStorm ? Anda bisa dengan mudah menyelesaikan ini sendiri, Anda sangat dekat, jika Anda bisa menelusuri kode seperti sekarang saya bisa. Jika ya, jangan buang waktu Anda di XDEBUG yang sangat bermasalah dan unduh Zend Debugger .

PS Ini adalah jawaban saya sebelumnya. Saya memposting ini sebelum saya menyadari apa yang sebenarnya ditanyakan Jared. Itu benar, tetapi tidak terkait dengan pertanyaannya. :)


Saya pikir yang Anda cari adalah add_image_size():

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

Sebagai contoh:

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

Dengan mengatur WordPress ini akan membuat ukuran-ukuran itu secara otomatis. Apa itu yang kau butuhkan?

MikeSchinkel
sumber
Saya tidak yakin tentang itu, dia meminta untuk membuat ukuran media default.
Bainternet
Hmm. Fungsi wp_generate_attachment_metadata()melakukan itu jika add_image_size()diatur. Mungkin dia tidak mencoba menggunakan add_image_size()untuk mengatur ukuran gambar?
MikeSchinkel
ya tapi, jaredwilli mengatakan bahwa ukuran bawaan bawaan WordPress (besar, sedang, gambar kecil) tidak sedang dibuat maka bermuka masam penambahan ukuran tambahan menggunakan add_image_size () juga tidak akan dibuat.
Bainternet
atau mungkin saya tidak mendapatkan pertanyaan sama sekali :)
Bainternet
@ בניית אתרים - Saya juga bingung sekarang. Saya pikir kita perlu menunggu klarifikasi di sini dari @jaredwilli.
MikeSchinkel
0

jika saya mengerti pertanyaan Anda, Anda perlu mendapatkan daftar ukuran pertama seperti ini:

$image_sizes = get_intermediate_image_sizes();

ini mengembalikan sebuah array dari semua ukuran gambar yang terdaftar (default: besar, sedang, thumbnail, ukuran khusus apa pun yang terdaftar menggunakan "add_image_size ()" maka yang harus Anda lakukan adalah mengulang melalui masing-masing ukuran dan membuat gambar untuk ukuran seperti ini:

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

ganti $ file dengan path file yang diunggah dan $ crop dengan true atau false jika Anda ingin memotong gambar ke dimensi baru atau false untuk mengubah ukuran.

Bainternet
sumber
@ בניית אתרים - Jika Anda melihat kode untuk wp_generate_attachment_metadata()di /wp-admin/includes/image.phpAnda akan melihatnya melakukan persis apa yang Anda diposting di atas, dan dia sudah memanggil itu. Jadi jika itu tidak sedang dibuat maka mungkin dia punya plugin yang menyaringnya menggunakan 'intermediate_image_sizes_advanced'hook?
MikeSchinkel
Saya sebenarnya belum mencoba menggunakan get_intermediate_image_sizes (); Saya tidak tahu bahwa itu memiliki semua ukuran yang terdaftar. Yang bagus untuk diketahui sekarang. Saya masih tidak begitu mengerti bagaimana ukuran gambar yang dihasilkan dikaitkan dengan lampiran tertentu, seperti jika saya melihat di perpustakaan media, Anda melihat 3 pilihan ukuran, ketika memilih salah satu dari itu, ia tahu gambar mana yang akan diambil . Idk, itu tidak penting. Kecuali itu. Setelah melakukan foreach loop variabel apa yang akan saya gunakan untuk menambahkan lampiran? $ gambar ['ibu jari'] atau sesuatu (ukuran apa pun yang saya inginkan)?
jaredwilli
@ בניית אתרים - Kami berdua melewatkan masalah sebenarnya pada awalnya. Masalah sebenarnya adalah sekitar 7 atau 8 kesalahan kode pada contoh aslinya. Lihat jawaban saya yang diperbarui.
MikeSchinkel
Ya itu sudah terlambat di sini dan saya sudah mati otak.
Bainternet
@ בניית אתרים - Sama. :)
MikeSchinkel