Philipp, apa pun mungkin terjadi jika Anda memutuskan untuk melakukannya. Anda dapat mengatasi masalah Anda dengan memperluas kelas editor gambar WordPress.
Catatan Saya menggunakan WordPress 3.7 - Saya belum memeriksa salah satu kode di bawah ini dalam versi sebelumnya dan dalam rilis 3.8 terbaru.
Dasar-dasar Editor Gambar
WordPress memiliki dua kelas bawaan yang menangani manipulasi gambar:
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
Kedua kelas ini diperluas WP_Image_Editor
karena keduanya menggunakan mesin gambar yang berbeda (masing-masing GD dan ImageMagick) untuk memuat, mengubah ukuran, mengompres, dan menyimpan gambar.
Secara default WordPress akan mencoba menggunakan mesin ImageMagick terlebih dahulu, yang membutuhkan ekstensi PHP, karena umumnya lebih disukai daripada mesin GD default PHP. Sebagian besar server bersama tidak memiliki ekstensi ImageMagick diaktifkan.
Tambahkan Editor Gambar
Untuk memutuskan mesin mana yang akan digunakan, WordPress memanggil fungsi internal __wp_image_editor_choose()
(terletak di /wp-includes/media.php
). Fungsi ini melewati semua mesin untuk melihat mesin mana yang dapat menangani permintaan.
Fungsi ini juga memiliki filter bernama wp_image_editors
yang memungkinkan Anda menambahkan lebih banyak editor gambar seperti:
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
Perhatikan kami sedang menambahkan kelas editor gambar khusus kami WP_Image_Editor_Custom
sehingga WordPress akan memeriksa apakah mesin kami dapat menangani pengubahan ukuran sebelum menguji mesin lain.
Membuat Editor Gambar kami
Sekarang kita akan menulis editor gambar kita sendiri sehingga kita dapat memutuskan nama file untuk diri kita sendiri. Nama file ditangani oleh metode WP_Image_Editor::generate_filename()
(kedua mesin mewarisi metode ini), jadi kita harus menimpa itu di kelas kustom kami.
Karena kami hanya berencana mengubah nama file, kami harus memperluas salah satu mesin yang ada sehingga kami tidak perlu menemukan kembali kemudi. Saya akan memperluas WP_Image_Editor_GD
dalam contoh saya, karena Anda mungkin tidak memiliki ekstensi ImageMagick diaktifkan. Kode ini dapat dipertukarkan untuk pengaturan ImageMagick. Anda dapat menambahkan keduanya jika Anda berencana menggunakan tema pada pengaturan yang berbeda.
// Include the existing classes first in order to extend them.
require_once ABSPATH.WPINC."/class-wp-image-editor.php";
require_once ABSPATH.WPINC."/class-wp-image-editor-gd.php";
class WP_Image_Editor_Custom extends WP_Image_Editor_GD {
public function generate_filename($prefix = NULL, $dest_path = NULL, $extension = NULL) {
// If empty, generate a prefix with the parent method get_suffix().
if(!$prefix)
$prefix = $this->get_suffix();
// Determine extension and directory based on file path.
$info = pathinfo($this->file);
$dir = $info['dirname'];
$ext = $info['extension'];
// Determine image name.
$name = wp_basename($this->file, ".$ext");
// Allow extension to be changed via method argument.
$new_ext = strtolower($extension ? $extension : $ext);
// Default to $_dest_path if method argument is not set or invalid.
if(!is_null($dest_path) && $_dest_path = realpath($dest_path))
$dir = $_dest_path;
// Return our new prefixed filename.
return trailingslashit($dir)."{$prefix}/{$name}.{$new_ext}";
}
}
Sebagian besar kode di atas disalin langsung dari WP_Image_Editor
kelas dan berkomentar untuk kenyamanan Anda. Satu-satunya perubahan aktual adalah sufiks sekarang menjadi awalan.
Atau, Anda bisa memanggil parent::generate_filename()
dan menggunakan mb_str_replace()
untuk mengubah akhiran menjadi awalan, tapi saya pikir itu akan lebih cenderung salah.
Menyimpan jalur baru ke metadata
Setelah mengunggah image.jpg
, folder unggahan terlihat seperti ini:
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
Sejauh ini bagus. Namun, ketika memanggil fungsi-fungsi dasar seperti wp_get_attachment_image_src()
, kami akan melihat semua ukuran gambar disimpan sebagai image.jpg
tanpa jalur direktori baru.
Kami dapat mengatasi masalah ini dengan menyimpan struktur folder baru ke metadata gambar (tempat nama file disimpan). Data berjalan melalui berbagai filter ( wp_generate_attachment_metadata
antara lain) sebelum dimasukkan ke dalam database, tapi karena kami sudah menerapkan editor gambar kustom, kami dapat melakukan perjalanan kembali ke sumber gambar ukuran metadata: WP_Image_Editor::multi_resize()
. Ini menghasilkan array seperti ini:
Array (
[thumbnail] => Array (
[file] => image.jpg
[width] => 150
[height] => 150
[mime-type] => image/jpeg
)
[medium] => Array (
[file] => image.jpg
[width] => 300
[height] => 300
[mime-type] => image/jpeg
)
)
Kami akan menimpa multi_resize()
metode di kelas khusus kami:
function multi_resize($sizes) {
$sizes = parent::multi_resize($sizes);
foreach($sizes as $slug => $data)
$sizes[$slug]['file'] = $data['width']."x".$data['height']."/".$data['file'];
return $sizes;
}
Seperti yang Anda lihat, saya tidak repot-repot mengganti kode apa pun. Saya hanya memanggil metode induk dan membiarkannya menghasilkan metadata. Lalu saya loop melalui array yang dihasilkan dan menyesuaikan file
nilai untuk setiap ukuran.
Sekarang wp_get_attachment_image_src($att_id, array(300, 300))
kembali 2013/12/300x300/image.jpg
. Hore!
Pikiran terakhir
Saya harap ini memberikan dasar yang bagus untuk Anda uraikan. Namun, harap dicatat jika gambar lebih kecil dari ukuran yang ditentukan (mis. 280x300), akhiran yang dihasilkan (awalan dalam kasus kami) dan ukuran gambar 280x300, bukan 300x300. Jika Anda mengunggah banyak gambar yang lebih kecil, Anda akan mendapatkan banyak folder berbeda.
Sebuah solusi yang baik akan baik menggunakan ukuran siput sebagai nama folder ( small
, medium
, dan sebagainya) atau memperluas kode untuk ukuran putaran hingga ukuran gambar terdekat disukai.
Anda mencatat bahwa Anda ingin menggunakan hanya lebarnya sebagai nama direktori. Berhati-hatilah - plugin atau tema dapat menghasilkan dua ukuran berbeda dengan lebar yang sama tetapi ketinggian berbeda.
Anda juga dapat menghapus folder tahun / bulan dengan menonaktifkan 'Atur unggahan saya ke dalam folder berbasis bulan dan tahun' di bawah Pengaturan> Media atau dengan memanipulasi generate_filename
lebih jauh.
Semoga ini membantu. Semoga berhasil!