Yüklenen orijinal resmi otomatik olarak büyük resim boyutuyla değiştir


13

Kullanıcılarımız web sitesinde kullanmak için düzenli olarak ~ 6MB resim yüklediklerinden (ve önce nasıl yeniden boyutlandırılacağını bilmediklerinden), WordPress orijinalleri saklar ve birkaç farklı boyuta yeniden boyutlandırır.

Yüklenen görüntüyü alan, daha yönetilebilir bir şeye yeniden boyutlandıran ve daha sonra orijinalin yerini alan bir işlev veya eklenti istiyorum.

Orijinali silen ancak değiştirmeyen bazı işlevler gördüm, yani küçük resimleri daha sonraki bir tarihte yeniden oluşturmak imkansızdır. Kullanıcı büyük bir görüntü yükleyebilir ve otomatik olarak yeniden boyutlandırılır ve gerekirse gelecekteki yeniden boyutlandırma için saklanır böylece değiştirilmesi gerekiyor.

Yanıtlar:


10

Bunu tema klasöründeki function.php dosyasına ekleyin. Orijinal görüntüyü ayarlarda ayarlanan büyük görüntüyle değiştirir. Yeni bir görüntü formatı ayarlamak ve bunu yeni orijinal boyut olarak kullanmak isteyebilirsiniz.

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];
  unset($image_data['sizes']['large']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

1
Bu çözüm işe yararsa, bir eklenti yapmak çok yararlı olacaktır.
Alexey

Bunu tekrar denedim ve ilk önce 2048x1536 (ihtiyaç duyduğumun iki katı büyüklüğünde) olan yeni bir boyut ('tam boyut' olarak adlandırıldı) ekledim ve şimdi hepsi çalışıyor, orijinal görüntüler sadece iki kat daha fazla kaydedilir birçok kez ihtiyaç duyduğum kadar büyük (gelecek için saklamak istediğim). Teşekkürler!
Shaun

Harika şeyler, sevindim senin için çalıştı!
Paul Phillips

Bu kod her şeyi benim function.php dosyasından sildi. WP editöründe ve FTP'de kontrol ettim ve dosya boştu. Bir yedekten dosyayı geri yüklemek zorunda kaldı. :(
jlg

1
@Ciprian Hepsini yinelemek için bir komut dosyası ayarlamanız gerekir. Eminim tüm ek bilgileri almak için bir WordPress yolu var ama $ wpdb-> get_col ('wp_posts' dan SELECT id WHERE post_type = "attachment" ORDER BY id '); görüntüler için yazı kimliklerinin bir listesini almak için çalışır. Belki ekleyin: AND post_mime_type = "image / jpeg" de sadece jpegs ile sınırlamak için. Her görüntünün gerçek konumu wp_postmeta konumunda tutulur.
Paul Phillips

3

Yukarıdaki çözümde kötü bir hata var. Çözüm yeni görüntüler için cazibe olarak çalışır, ancak eski görüntüler için asla karşılaştırmamalısınız, $upload_dir['path']çünkü bu geçerli ayın geçerli yükleme klasörüdür.

Aşağıdakileri değiştirin:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

2

Yukarıdaki cevabın kodunda bir güncelleme önerebilir miyim? Ne yazık ki Wordpress'in yeni sürümlerinde dosya yolu için 'yol' anahtarı artık sağlanmamıştır. Bu yüzden eski yazı yüklemelerinde çalışmasını sağlamak için, önce geçerli alt dizini orijinal görüntüden almalı ve bunu büyük resmin konum yolunu yapmak için kullanmalıyız.

Bu satırı değiştirin:

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

bu 2 satırla:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

0

Bunu burada çok benzer bir soruya gönderdim, ancak yeniden düzenlemeye değer olduğunu düşündüm.

Yukarıdaki kod ile ilgili sorunlar vardı ve benim için ne çalıştı aslında bu satırları değiştiriyordu .:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

ile:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

Tam kodumu ve daha fazla açıklamayı burada yayınladım: Orijinal resmi sil - küçük resmi koru?

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.