Как хранятся thumbnails изображения в WordPress
Все изображения в WordPress хранятся подобно постам в таблице wp_posts с типом attachment.
Найдем изображение по названию самого файла:
$sql = 'SELECT * FROM wp_posts WHERE post_type = "attachment" AND guid LIKE "%image_file_name%"';
$attachment = $wpdb->get_row($sql, ARRAY_A);
Я убрал из результата несущественные данные:
Array
(
[ID] => 37687
[post_title] => Заголовок изображения
[post_name] => Уникальное название картинки (это не название файла, а сгенерированное название изображения)
[post_excerpt] => Подпись изображения
[post_content] => Описание изображения
[post_status] => inherit
[post_parent] => 37675
[guid] => http://your.site/wp-content/uploads/2016/05/image_file_name.jpg
[post_type] => attachment
[post_mime_type] => image/jpeg
)
Также изображение содержит дополнительные мета-данные в таблице wp_postmeta:
Array
(
[post_id] => 37687
[_wp_attached_file] => 2016/05/image_file_name.jpg
[_wp_attachment_image_alt] => Значение атрибута alt
[_wp_attachment_metadata] => {serialize array} Доступные размеры миниатюр
)
Доступные размеры миниатюр и названия изображений миниатюр хранятся в meta-данных как сериализованный массив (мета-поле _wp_attachment_metadata):
$sql = 'SELECT * FROM `wp_postmeta` WHERE post_id = "%d"';
$sql = $wpdb->prepare($sql, $attachment['ID']);
$meta = $wpdb->get_results($sql, ARRAY_A);
Array
(
[0] => Array
(
[meta_id] => 188921
[post_id] => 37687
[meta_key] => _wp_attached_file
[meta_value] => 2016/05/image_file_name.jpg
)
[1] => Array
(
[meta_id] => 188922
[post_id] => 37687
[meta_key] => _wp_attachment_metadata
[meta_value] => <SERIALIZED_ARRAY>
)
)
Формат сериализованного массива с доступными миниатюрами:
Array
(
[width] => 915
[height] => 500
[file] => 2016/05/image_file_name.jpg
[sizes] => Array
(
[thumbnail] => Array
(
[file] => image_file_name-300x164.jpg
[width] => 300
[height] => 164
[mime-type] => image/jpeg
)
[medium] => Array
(
[file] => image_file_name-640x350.jpg
[width] => 640
[height] => 350
[mime-type] => image/jpeg
)
[medium_large] => Array
(
[file] => image_file_name-768x420.jpg
[width] => 768
[height] => 420
[mime-type] => image/jpeg
)
)
[image_meta] => Array
(
[aperture] => 0
[credit] =>
[camera] =>
[caption] => Druck
[created_timestamp] => 1435250882
[copyright] =>
[focal_length] => 0
[iso] => 0
[shutter_speed] => 0
[title] => Druck
[orientation] => 1
[keywords] => Array()
)
)
Ну и представление самих файлов в каталоге uploads/:
find wp-content/uploads -name 'image_file_name*'
wp-content/uploads/2016/05/Depositphotos_86251880_m-2015-Copy-640x350.jpg
wp-content/uploads/2016/05/Depositphotos_86251880_m-2015-Copy-300x164.jpg
wp-content/uploads/2016/05/Depositphotos_86251880_m-2015-Copy.jpg
wp-content/uploads/2016/05/Depositphotos_86251880_m-2015-Copy-768x420.jpg
Каждый раз когда мне необходимо работать с миниатюрками изображений - я задаюсь одним вопросом: "Почему миниатюрки из коробки не генерятся на лету?". Вот почему бы не генерить уменьшенное изображение при первом запросе? Вместо этого, в WordPress нужно заранее задать все необходимые размеры картинок, которые будут генериться при загрузке картинки.
Недостатки такого подхода:
- При добавлении нового размера миниатюры, старые картинки не будут содержать этой миниатюрки. Уже нужно ставить плагин для перегенерации миниатюр. Но со временем у вас соберется картинок на десятки гигабайт. Геморой..
- Если блог развернут на нескольких окружениях (local, stage, prod) - рано или поздно вам придется тащить картинки с сервака. По первой, пока задачи не касаются использования миниатюр - вы, конечно, можете пробросить запросы на продакшн сервер с помощью того же веб-сервера. Но когда-нибудь вам потребуется затянуть на локалку все гигабайты ваших картинок.
#wp attachment images, #wp preview images, #wp images thumbnails