Philipp, fikrini ona koyarsan her şey mümkün. WordPress resim düzenleyici sınıfını genişleterek sorununuzu çözebilirsiniz.
Not WordPress 3.7 kullanıyorum - Önceki kodlarda ve en son 3.8 sürümünde aşağıdaki kodlardan herhangi birini kontrol etmedim.
Image Editor ile ilgili temel bilgiler
WordPress, görüntü manipülasyonunu işleyen iki yerleşik sınıfa sahiptir:
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
Bu iki sınıf WP_Image_Editor
, her ikisi de görüntüleri yüklemek, yeniden boyutlandırmak, sıkıştırmak ve kaydetmek için farklı bir görüntü motoru (sırasıyla GD ve ImageMagick) kullandığından uzar.
WordPress varsayılan olarak, PHP eklentisine ihtiyaç duyan ImageMagick motorunu ilk önce kullanmaya çalışır, çünkü genellikle PHP'nin varsayılan GD motoruna tercih edilir. Çoğu paylaşılan sunucuda ImageMagick uzantısı etkin değildir.
Resim Düzenleyici Ekle
Hangi motorun kullanılacağına karar vermek için WordPress dahili bir işlevi çağırır __wp_image_editor_choose()
(içinde bulunur /wp-includes/media.php
). Bu işlev, hangi motorun isteği işleyebileceğini görmek için tüm motorlarda dolaşır.
İşlev ayrıca şöyle bir wp_image_editors
görüntü düzenleyicisi eklemenize izin veren bir filtreye sahiptir :
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
Biz ediyoruz Not prepending bizim özel resim editörü sınıfı WP_Image_Editor_Custom
bizim motor diğer motorlar test etmeden önce yeniden boyutlandırma işleyebilir eğer WordPress kontrol edecek, böylece.
Resim Düzenleyicimizi oluşturma
Şimdi kendi görüntü düzenleyicimizi yazacağız, böylece dosya adlarına kendimiz karar verebiliriz. Dosya adlandırma yöntemi tarafından kullanılır WP_Image_Editor::generate_filename()
(her iki motor da bu yöntemi devralır), bu nedenle özel sınıfımızda bunun üzerine yazmalıyız .
Yalnızca dosya adlarını değiştirmeyi planladığımız için, mevcut motorlardan birini genişletmeliyiz, böylece tekerleği yeniden icat etmek zorunda değiliz. Ben uzatacaktır WP_Image_Editor_GD
muhtemelen ImageMagick uzantısı etkin olmayan, benim örnekte. Kod bir ImageMagick kurulumu için değiştirilebilir. Temayı farklı kurulumlarda kullanmayı planlıyorsanız her ikisini de ekleyebilirsiniz.
// 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}";
}
}
Yukarıdaki kodun çoğu doğrudan WP_Image_Editor
sınıftan kopyalanmış ve size kolaylık olması için yorumlanmıştır. Tek gerçek değişiklik, son ekin artık bir önek olmasıdır.
Alternatif olarak, sadece soneki bir önek haline getirmek parent::generate_filename()
için bir çağırabilir ve kullanabilirsiniz mb_str_replace()
, ancak yanlış gitmeye daha meyilli olacağını düşündüm.
Meta verilere yeni yollar kaydetme
Yüklemeden sonra image.jpg
, uploads klasörü şöyle görünür:
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
Çok uzak çok iyi. Ancak, gibi temel işlevleri çağırırken wp_get_attachment_image_src()
, tüm görüntü boyutlarının image.jpg
yeni dizin yolu olmadan kaydedildiğini fark edeceğiz .
Yeni klasör yapısını görüntü meta verilerine (dosya adlarının depolandığı yer) kaydederek bu sorunu çözebiliriz. (Çeşitli filtrelerden veri çalışır wp_generate_attachment_metadata
önce diğerlerinin yanı sıra) veritabanına sokulmadan, ama biz zaten özel bir görüntü düzenleyici uyguluyorsanız bu yana, görüntü boyutu meta kaynağına geri seyahat edebilirsiniz: WP_Image_Editor::multi_resize()
. Bunun gibi diziler üretir:
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
)
)
multi_resize()
Özel sınıfımızdaki yöntemin üzerine yazacağız :
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;
}
Gördüğünüz gibi, herhangi bir kodu değiştirmek için uğraşmadı. Sadece üst yöntemi çağırıyorum ve meta veri oluşturmasına izin verdim. Sonra ortaya çıkan dizi döngü ve file
her boyut için değeri ayarlamak .
Şimdi wp_get_attachment_image_src($att_id, array(300, 300))
geri dönüyor 2013/12/300x300/image.jpg
. Yaşasın!
Son düşünceler
Umarım bu sizin üzerinde ayrıntılı bir temel oluşturmuştur. Ancak, bir görüntünün belirtilen boyuttan küçük olması durumunda (örn. 280x300), oluşturulan son ekin (bizim durumumuzdaki önek) ve görüntü boyutlarının 300x300 değil 280x300 olduğunu unutmayın. Çok daha küçük resimler yüklerseniz, birçok farklı klasör elde edersiniz.
Klasör adı (apre sülük kullanmak ya için iyi bir çözüm olacaktır small
, medium
ve saire) veya en yakın tercih edilen görüntü boyutu yuvarlak boyutları için kodu genişletmek.
Bir dizin adı olarak yalnızca genişliği kullanmak istediğinizi belirttiniz. Ancak uyarılmalıdır - eklentiler veya temalar aynı genişlikte ancak farklı yüksekliklerde iki farklı boyut oluşturabilir.
Ayrıca, yıl / ay klasörlerini Ayarlar> Medya altındaki 'Yüklemelerimi ay ve yıl tabanlı klasörlere düzenle' seçeneğini devre dışı bırakarak veya generate_filename
daha da ileri giderek kaldırabilirsiniz .
Bu yardımcı olur umarım. İyi şanslar!