Філіппе, все можливе, якщо ти налаштовуєшся на це. Ви можете вирішити свою проблему, розширивши клас редактора зображень WordPress.
Примітка. Я використовую WordPress 3.7 - я не перевіряв жодного з наведених нижче кодів у попередніх версіях та в останній версії 3.8.
Основи редактора зображень
У WordPress є два вбудовані класи, які обробляють зображення:
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
Ці два класи поширюються, WP_Image_Editor
оскільки обидва використовують інший механізм зображення (GD та ImageMagick відповідно) для завантаження, зміни розміру, стискання та збереження зображень.
За замовчуванням WordPress спершу спробує використати двигун ImageMagick, якому потрібне розширення PHP, оскільки він, як правило, кращий перед двигуном GD за замовчуванням PHP. У більшості спільних серверів не ввімкнено розширення ImageMagick.
Додайте редактор зображень
Щоб вирішити, який двигун використовувати, WordPress викликає внутрішню функцію __wp_image_editor_choose()
(розташовану в /wp-includes/media.php
). Ця функція проходить через усі двигуни, щоб побачити, який двигун може обробити запит.
У функції також є фільтр під назвою, wp_image_editors
який дозволяє додавати більше редакторів зображень на зразок:
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
Зверніть увагу , що ми випереджаючи наш користувальницький клас редактора зображень , WP_Image_Editor_Custom
так що WordPress перевірятиме , якщо наш двигун може обробляти зміна розміру перед тестуванням інших двигунів.
Створення нашого редактора зображень
Тепер ми запишемо власний редактор зображень, щоб ми могли самі вирішувати назви файлів. Ім'я файлів обробляється методом WP_Image_Editor::generate_filename()
(обидва двигуни успадковують цей метод), тому нам слід перезаписати це в нашому спеціальному класі.
Оскільки ми плануємо лише змінити імена файлів, нам слід розширити один із існуючих двигунів, щоб нам не довелося винаходити колесо. Я продовжую WP_Image_Editor_GD
в своєму прикладі, оскільки у вас, ймовірно, не ввімкнено розширення ImageMagick. Код є взаємозамінним для налаштування ImageMagick. Ви можете додати обидва, якщо плануєте використовувати тему в різних налаштуваннях.
// 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}";
}
}
Більшість наведених вище кодів було скопійовано безпосередньо з WP_Image_Editor
класу та прокоментовано для вашої зручності. Єдина фактична зміна полягає в тому, що суфікс тепер є префіксом.
Крім того, ви можете просто зателефонувати parent::generate_filename()
та використати a, mb_str_replace()
щоб змінити суфікс на префікс, але я вважав, що це буде більш схильне піти не так.
Збереження нових шляхів до метаданих
Після завантаження image.jpg
папка завантажень виглядає приблизно так:
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
Все йде нормально. Однак при виклику основних функцій, як-от wp_get_attachment_image_src()
, ми помітимо, що всі розміри зображень зберігаються як image.jpg
без нового шляху до каталогу.
Ми можемо вирішити цю проблему, зберігаючи нову структуру папок у метадані зображення (де зберігаються назви файлів). Траси даних через різні фільтри ( wp_generate_attachment_metadata
серед інших), перш ніж вставити в базу даних, але так як ми вже реалізуємо користувальницькі редактор зображень, ми можемо повернутися назад до джерела метаданих розміру зображення: WP_Image_Editor::multi_resize()
. Він генерує такі масиви:
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()
метод у нашому спеціальному класі:
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;
}
Як бачите, я не заважав замінювати будь-який код. Я просто закликаю батьківський метод і нехай він генерує метадані. Потім я перебираю отриманий масив і коригую file
значення для кожного розміру.
Тепер wp_get_attachment_image_src($att_id, array(300, 300))
повертається 2013/12/300x300/image.jpg
. Ура!
Заключні думки
Я сподіваюсь, що це стало гарною основою для вашої роботи. Однак, зверніть увагу, якщо зображення менше вказаного розміру (наприклад, 280x300), згенерований суфікс (у нашому випадку префікс) та розміри зображення - 280x300, а не 300x300. Якщо ви завантажите багато менших зображень, ви отримаєте безліч різних папок.
Хороше рішення було б використовувати або кулі розміру в якості імені папки ( small
, medium
, і так далі) або розширити код для круглих розмірів до найближчого кращого розміру зображення.
Ви зазначили, що хочете використовувати саме ширину як ім'я каталогу. Але будьте попереджені - плагіни або теми можуть генерувати два різних розміри з однаковою шириною, але різної висоти.
Крім того, ви можете видалити папки року / місяця, відключивши "Впорядкувати мої завантаження в папки на місяць та рік" у розділі Налаштування> Медіа або generate_filename
ще більше маніпулюючи .
Сподіваюсь, це допомагає. Удачі!