Как хранятся thumbnails изображения в WordPress

Категория: 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 нужно заранее задать все необходимые размеры картинок, которые будут генериться при загрузке картинки.

Недостатки такого подхода:

  1. При добавлении нового размера миниатюры, старые картинки не будут содержать этой миниатюрки. Уже нужно ставить плагин для перегенерации миниатюр. Но со временем у вас соберется картинок на десятки гигабайт. Геморой..
  2. Если блог развернут на нескольких окружениях (local, stage, prod) - рано или поздно вам придется тащить картинки с сервака. По первой, пока задачи не касаются использования миниатюр - вы, конечно, можете пробросить запросы на продакшн сервер с помощью того же веб-сервера. Но когда-нибудь вам потребуется затянуть на локалку все гигабайты ваших картинок.

#wp attachment images, #wp preview images, #wp images thumbnails