WP medya yükleyicisi 3 farklı boyutlu görüntüyü nasıl oluşturur ve nasıl çoğaltabilirim


17

Nihayet var !! Bu şeyi yapmak için yaklaşık 12 kez ve 12 farklı şekilde denedim, ama sonunda işe yaradı, ... biraz.

Yazılara resim yüklemek ve eklemek için özel bir meta kutu yaptım ve WP'de yerleşik olan korkunç kalın kutu medya yükleyiciyi kullanmanızı gerektirmiyor. O şeyden nefret ediyorum. Hayır, yaptığım sadece isterseniz ek ekler eklemek için çoğaltabileceğiniz bir grup girdi (başlık, açıklama, dosya). Böylece alanları doldurun, yüklenecek bir resim seçin ve taslağı kaydedin veya yayını yayınlayın. Bir gönderiye ek eklendikten sonra, meta kutu, eklediğiniz her ek için ekli görüntünün önizleme görüntüsüyle birlikte giriş alanlarını görüntüler. Başlık ve açıklama alanları meta verileri oluşturmak için kullanılır, hiçbir şey bildiğim post_meta olarak kaydedilmez. Şu anda şimdiye kadar çalıştığım şey bu.

Bir gönderiyi kaydettiğinizde / yayınladığınızda, eklenti dosyalarını yüklediğinizde / eklediğinizde, varsayılan wp yükleyicisinin küçük resim, orta, büyük ve tam boyutlu görüntüyü koruduğu gibi üç görüntü boyutu oluşturacağı şekilde yapmam gerekiyor . Bu bir şekilde mümkünse. Değilse, add_image_size()yeni özel boyutlar oluşturmak / tanımlamak ve yükleme sırasında bunları bu şekilde oluşturmak için başka şekilde kullanmak istiyorum.

Bu durumda hangi işlevin kullanmak için en ideal olduğundan emin değilim, belki image_make_intermediate_size()işlev daha iyi olurdu, ya wp_create_thumbnail()da wp_crop_image()... kim bilir!

wp_handle_upload()Her biri için işlevi çalıştırmam gerekiyorsa , ya da belki de wp_generate_attachment_metadata()işlevi içeren bir şey yapmak için bunu nasıl yapacağımı anlayamıyorum . 3 görüntü boyutu aynı ekin varyantları olarak ilişkilendirilecek ve bunu nasıl yapacağınız için kafa karıştırıcı.

Web'i inceledim, her wp medya / yükleme / görüntü ile ilgili dosyanın kaynağını okudum ve medya yükleme şeyler için hemen hemen her işlevle oynadım ve WP'nin 3 görüntü boyutunu her yerde nasıl oluşturduğunu veya nasıl yapılacağını bulamıyorum kendim.

Wp-include / media.php dosyasında image_resize()tam olarak olması gerektiği için işlev en iyi gibi görünüyor. Sadece hayatım boyunca ne eksik ya da ne yapmayı denediğimi anlayamıyorum ama küçük resim yapmak için yanlış yaptım.

İşte wp_handle_upload()işleri ve işleri yapan benim çalışma fonksiyonu , ama aynı zamanda 100px başparmak oluşturmak ve resmin 500px gibi maksimum genişlik ve yüklenen bir yeni dosyalar olarak kaydedilen bir yeniden boyutlandırma sürümü yapmak gerekir.

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

Nihayet bu düzeltmek için bana yardım edebilen herkes düzgün çalışır sevilirdi. Bu şeyi geliştirmeye çalışırken çok sayıda saçma sayısız saat harcadım ve dokümantasyon berbat, ve bunun nasıl yapılacağı konusunda hiçbir iyi mesaj yok.

Teşekkürler


Aşağıdaki çeşitli cevapların yorumlarına bakın ve ben ya da @ בניית אתרים ya da her ikimizin de ihtiyacınız olan şeyle karıştırıldığını düşünüyorum.
MikeSchinkel

Herkes bunu çözdü ?? Benzer bir soruna sahip olmak, web üzerinde uzun zamandır bu konuda kaşlarını çattı.

Yanıtlar:


6

Merhaba @jaredwilli:

Kanka! Cesur çaba ve iyi iş. Hepsi bir arada, WordPress'e harika bir katkı olabilir.

Çok yakındınız, ancak 5 ila 10 arasında küçük bir varsayım ya da kod başlamış gibi göründünüz, ancak işe yaramadığı için geri dönmediniz. Sadece düzeltmek için ihtiyaç duyduğum kadarını tekrar ettim. Çözüm takip eder ve sizin veya daha az yanmış biriyle yan yana karşılaştırmayı bırakacağım. :)

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

Hey, neden kendinize PhpStorm'un bir kopyasını almıyorsunuz ? Bunu kolayca kendiniz çözmüş olabilirsiniz, sooo yakınsınızdı, şimdi yapabildiğim gibi koddan geçebilseydiniz. Bunu yaparsanız, zamanınızı çok büyük XDEBUG'da boşa harcamayın ve bunun yerine Zend Debugger'ı indirin .

PS: Bu benim eski cevabım. Jared'in tam olarak ne istediğini anlamadan önce bunu gönderdim. Bu doğru, ancak sorusuyla ilgili değil. :)


Bence aradığınız şey add_image_size():

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

Örneğin:

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

Bu WordPress ayarlandığında bu boyutları otomatik olarak oluşturur. Neye ihtiyacın var?


Bundan emin değilim, varsayılan ortam boyutlarının oluşturulmasını istiyor.
Bainternet

Hmm. İşlev , ayarlanmışsa wp_generate_attachment_metadata()bunu yapar add_image_size(). Belki add_image_size()de görüntü boyutlarını ayarlamak için kullanmayı denemedi ?
MikeSchinkel

evet, ancak jaredwilli varsayılan WordPress yerleşik boyutlarının (büyük, orta, küçük resim) oluşturulmadığını söylüyor, sonra add_image_size () kullanarak ekstra eklenen boyutların da oluşturulmayacağını söylüyor.
Bainternet

ya da belki de soruyu hiç
anlamıyorum

@ בניית אתרים - Şimdi de kafam karışıyor. Sanırım burada @jaredwilli açıklamasını beklememiz gerekiyor.
MikeSchinkel

0

Eğer soru anlıyorsanız önce böyle boyutların listesini almak gerekir:

$image_sizes = get_intermediate_image_sizes();

bu kaydedilen tüm görüntü boyutlarından oluşan bir dizi döndürür (varsayılan: büyük, orta, küçük resim, "add_image_size ()" kullanılarak kaydedilmiş herhangi bir özel boyut bu:

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

görüntüyü yeni boyutlara veya yeniden boyutlandırmak için false değerine kırpmak istiyorsanız $ dosyasını yüklenen dosya yoluyla ve $ crop değerini true veya false ile değiştirin.


@ בניית אתרים - Neden kodlara göz atacak olursak wp_generate_attachment_metadata()içinde /wp-admin/includes/image.phpbunu yukarıda yayınlanan tam olarak ne yapar göreceğiz ve o zaten denir. Eğer bunlar oluşturulmuyorsa, belki de 'intermediate_image_sizes_advanced'kanca kullanarak onları filtreleyen bir eklentisi var mı?
MikeSchinkel

Aslında get_intermediate_image_sizes () kullanarak denemedim; Tüm kayıtlı boyutları aldığını bilmiyordum. Şimdi bilmek güzel. Oluşturulan görüntü boyutlarının belirli bir ek ile nasıl ilişkili olduğunu hala tam olarak anlamıyorum, ancak medya kitaplığına bakacak olsaydım, 3 boyut seçeneğini görüyorsunuz, bunlardan birini seçerken hangi görüntüyü yakalayacağını biliyor . Idk, bu kadar önemli değil. Olmadıkça. Bu foreach döngüsünü yaptıktan sonra eki eklemek için hangi değişkeni kullanırım? $ images ['thumb'] veya başka bir şey (istediğim boyutta)?
jaredwilli

@ בניית אתרים - Her ikimiz de ilk başta gerçek sorunu kaçırdık. Asıl sorun, orijinal örnekte yaklaşık 7 veya 8 kod hatasıydı. Güncellenmiş cevabımı görün.
MikeSchinkel

Evet, burada geç kalmıştım ve beynim ölmüştü.
Bainternet

@ בניית אתרים - Aynı. :)
MikeSchinkel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.