Secara otomatis mengganti gambar yang diunggah asli dengan ukuran gambar besar

13

Karena pengguna kami secara teratur mengunggah ~ 6MB gambar untuk digunakan di situs web (dan tidak terlalu terbiasa dengan cara mengubah ukurannya terlebih dahulu), WordPress menyimpan aslinya serta mengubah ukurannya ke beberapa ukuran yang berbeda.

Saya ingin fungsi atau plugin yang mengambil gambar yang diunggah, mengubah ukurannya menjadi sesuatu yang lebih mudah dikelola dan kemudian menggantikan yang asli.

Saya telah melihat beberapa fungsi yang menghapus yang asli tetapi tidak menggantinya, artinya tidak mungkin untuk membuat ulang thumbnail di kemudian hari. Saya perlu ini diganti sehingga pengguna dapat mengunggah gambar besar dan secara otomatis diubah ukurannya dan disimpan untuk pengubahan ukuran di masa mendatang jika diperlukan.

Shaun
sumber

Jawaban:

10

Tambahkan ini ke file functions.php di folder tema. Ini menggantikan gambar asli dengan gambar besar yang diatur dalam pengaturan. Anda mungkin ingin mengatur format gambar baru dan menggunakannya sebagai ukuran asli baru.

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');
Paul Phillips
sumber
1
Jika solusi ini berhasil, akan sangat berguna untuk membuat plugin.
Alexey
Saya baru saja mencoba ini lagi, tetapi pertama-tama saya menambahkan ukuran baru (disebut 'ukuran penuh') yaitu 2048x1536 (dua kali lebih besar dari yang saya butuhkan) dan sekarang semuanya berfungsi, gambar asli disimpan hanya dua kali lipat sebesar saya membutuhkannya (yang ingin saya simpan untuk masa depan) alih-alih berkali-kali. Terima kasih!
Shaun
Hal-hal hebat, senang itu berhasil untuk Anda!
Paul Phillips
Kode ini menghapus semuanya dari file functions.php saya. Saya memeriksa di WP editor dan di FTP dan file itu kosong. Harus mengembalikan file dari cadangan. :(
jlg
1
@ Ciprian Anda harus mengatur skrip untuk beralih melalui semuanya. Saya yakin ada cara WordPress untuk mendapatkan semua info lampiran tetapi $ wpdb-> get_col ('SELECT id FROM wp_posts WHERE post_type = "attachment" ORDER BY id'); akan bekerja untuk mendapatkan daftar Id posting untuk gambar. Mungkin menambahkan: DAN post_mime_type = "image / jpeg" juga untuk membatasi hanya jpeg. Lokasi sebenarnya dari setiap gambar disimpan di wp_postmeta.
Paul Phillips
3

Ada satu bug jahat dalam solusi di atas. Solusinya berfungsi sebagai pesona untuk gambar baru, tetapi untuk gambar lama, Anda jangan pernah membandingkannya $upload_dir['path']karena itu adalah folder unggahan saat ini di bulan ini.

Ganti yang berikut ini:

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

Bolehkah saya menyarankan pembaruan pada kode jawaban di atas? Sayangnya di versi Wordpress yang lebih baru, 'path' kunci tidak lagi disediakan untuk ukuran file. Jadi untuk membuatnya berfungsi pada unggahan posting yang lebih lama, kita harus terlebih dahulu mendapatkan subdir saat ini dari gambar asli dan menggunakan ini untuk membuat jalur lokasi untuk gambar besar.

Jadi ganti baris ini:

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

dengan 2 baris ini:

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

Saya memposting ini pada pertanyaan lain yang sangat mirip di sini, tetapi saya pikir itu layak reposting.

Saya memiliki masalah dengan kode di atas dan apa yang berhasil bagi saya pada dasarnya mengubah baris-baris ini .:

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

dengan:

    $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";
    }

Saya memposting kode lengkap dan penjelasan lebih lanjut di sini: Hapus gambar asli - simpan gambar kecil?

Pitchpole
sumber