Philipp, wszystko jest możliwe, jeśli się na to zdecydujesz. Możesz rozwiązać ten problem, rozszerzając klasę edytora obrazów WordPress.
Uwaga Używam WordPress 3.7 - nie sprawdziłem żadnego z poniższych kodów we wcześniejszych wersjach i najnowszej wersji 3.8.
Podstawy edytora obrazów
WordPress ma dwie wbudowane klasy, które obsługują manipulowanie obrazami:
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
Te dwie klasy rozszerzają się, WP_Image_Editor
ponieważ obie wykorzystują inny silnik obrazu (odpowiednio GD i ImageMagick) do ładowania, zmiany rozmiaru, kompresji i zapisywania obrazów.
Domyślnie WordPress najpierw spróbuje użyć silnika ImageMagick, który wymaga rozszerzenia PHP, ponieważ jest ogólnie preferowany w stosunku do domyślnego silnika GD PHP. Większość udostępnianych serwerów nie ma jednak włączonego rozszerzenia ImageMagick.
Dodaj edytor zdjęć
Aby zdecydować, którego silnika użyć, WordPress wywołuje funkcję wewnętrzną __wp_image_editor_choose()
(znajduje się w /wp-includes/media.php
). Ta funkcja przechodzi przez wszystkie silniki, aby zobaczyć, który silnik może obsłużyć żądanie.
Ta funkcja ma także filtr o nazwie, wp_image_editors
który pozwala dodawać kolejne edytory obrazów:
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
Uwaga: przygotowujemy naszą niestandardową klasę edytora obrazów, WP_Image_Editor_Custom
aby WordPress sprawdził, czy nasz silnik może obsłużyć zmianę rozmiaru przed przetestowaniem innych silników.
Tworzenie naszego edytora obrazów
Teraz napiszemy własny edytor obrazów, abyśmy mogli sami decydować o nazwach plików. Nazwy plików są obsługiwane przez tę metodę WP_Image_Editor::generate_filename()
(oba silniki dziedziczą tę metodę), więc powinniśmy zastąpić to w naszej klasie niestandardowej.
Ponieważ planujemy tylko zmieniać nazwy plików, powinniśmy rozszerzyć jeden z istniejących silników, abyśmy nie musieli wymyślać koła na nowo. Rozszerzę WP_Image_Editor_GD
w moim przykładzie, ponieważ prawdopodobnie nie masz włączonego rozszerzenia ImageMagick. Kod jest jednak wymienny dla konfiguracji ImageMagick. Możesz dodać oba, jeśli planujesz używać motywu w różnych konfiguracjach.
// 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}";
}
}
Większość powyższego kodu została bezpośrednio skopiowana z WP_Image_Editor
klasy i skomentowana dla Twojej wygody. Jedyną faktyczną zmianą jest to, że przyrostek jest teraz przedrostkiem.
Alternatywnie, możesz po prostu zadzwonić parent::generate_filename()
i użyć an, mb_str_replace()
aby zmienić sufiks na prefiks, ale doszedłem do wniosku, że bardziej skłonny byłby się pomylić.
Zapisywanie nowych ścieżek do metadanych
Po image.jpg
przesłaniu folder przesyłania wygląda następująco:
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
Na razie w porządku. Jednak podczas wywoływania podstawowych funkcji, takich jak wp_get_attachment_image_src()
, zauważymy, że wszystkie rozmiary obrazów są przechowywane tak, jak image.jpg
bez nowej ścieżki do katalogu.
Możemy obejść ten problem, zapisując nową strukturę folderów w metadanych obrazu (gdzie przechowywane są nazwy plików). Trasy danych przez różnych filtrów ( wp_generate_attachment_metadata
między innymi) zanim zostanie wprowadzony do bazy danych, ale skoro jesteśmy już wdrożenie niestandardowych edytora obrazu, możemy podróżować z powrotem do źródła metadanych Wielkość obrazu: WP_Image_Editor::multi_resize()
. Generuje tablice takie jak ta:
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
)
)
Zastąpimy multi_resize()
metodę w naszej klasie niestandardowej:
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;
}
Jak widać, nie zawracałem sobie głowy wymianą żadnego kodu. Po prostu wywołuję metodę nadrzędną i pozwalam jej generować metadane. Następnie przeglądam wynikową tablicę i dostosowuję file
wartość dla każdego rozmiaru.
Teraz wp_get_attachment_image_src($att_id, array(300, 300))
wraca 2013/12/300x300/image.jpg
. Brawo!
Końcowe przemyślenia
Mam nadzieję, że stanowiło to dobrą podstawę do opracowania. Pamiętaj jednak, że jeśli obraz jest mniejszy niż określony rozmiar (np. 280 x 300), wygenerowany sufiks (w naszym przypadku przedrostek) i rozmiary obrazów to 280 x 300, a nie 300 x 300. Jeśli prześlesz dużo mniejszych obrazów, otrzymasz wiele różnych folderów.
Dobrym rozwiązaniem byłoby albo użyć informacji o rozmiarze jako nazwy folderu ( small
, medium
itd.) Lub rozwinąć kod do okrągłych rozmiarów do najbliższego preferowanego rozmiaru obrazu.
Zauważyłeś, że chcesz użyć tylko szerokości jako nazwy katalogu. Ostrzegamy - wtyczki lub motywy mogą generować dwa różne rozmiary o tej samej szerokości, ale o różnych wysokościach.
Ponadto możesz usunąć foldery roku / miesiąca, wyłączając opcję „Organizuj moje przesłane pliki w folderach na miesiąc i rok” w Ustawieniach> Media lub manipulując generate_filename
jeszcze bardziej.
Mam nadzieję że to pomoże. Powodzenia!