Создайте эскиз для изображений с тем же размером, что и миниатюры

Я заметил, что WordPress не создает эскиз для изображения, если размер загруженного изображения совпадает с размером миниатюры.

Чтобы это было ясно, вот пример:

У меня есть изображение размером 300x200px . Размер моего миниатюры в настройках WordPress также 300x200 . Таким образом, когда я загружаю это изображение, размер эскиза размером 300x200 не будет создан, потому что загруженное изображение считается миниатюром WordPress!

Я отследил его до функции wp_generate_attachment_metadata() , которая решает не обрезать изображение, если размер изображения равен размеру миниатюры. Вот ссылка на контент этой функции.

Эта функция имеет фильтр, как показано ниже:

apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id );

Как я могу сделать эту функцию для создания миниатюры, независимо от размера?

Благодарю.

ОБНОВЛЕНИЕ 1:

После ответа от @birgire, я включил свою собственную multi_resize() в вопрос:

 function multi_resize($sizes) { $sizes = parent::multi_resize($sizes); //we add the slug to the file path foreach ($sizes as $slug => $data) { $sizes[$slug]['file'] = $slug . "/" . $data['file']; } return $sizes; } 

Я использую эту функцию для некоторых других целей, упомянув этот вопрос.

Solutions Collecting From Web of "Создайте эскиз для изображений с тем же размером, что и миниатюры"

Если я правильно понял вопрос, вы хотите сгенерировать

 test.jpg test-150x150.jpg 

а не просто:

 test.jpg 

когда вы загружаете изображение под названием test.jpg размером 150×150, такое же, как размер эскиза . ( Я использовал размер 150×150 вместо 300×200, чтобы не путать его со средним размером )

Это ограничение реализуется в multi_resize() классов редактора изображений, таких как WP_Image_Editor_Imagick и WP_Image_Editor_GD которые расширяют WP_Image_Editor :

 $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) ); 

Если размер совпадает с размером исходного изображения, он не генерируется.

Возможным обходным решением может стать расширение класса изображения до ваших потребностей и добавление его в список доступных редакторов изображений через фильтр wp_image_editors .

В качестве альтернативы вы можете попытаться подключиться к wp_generate_attachment_metadata чтобы сгенерировать недостающий дубликат с помощью редактора изображений, например метода save() .

Чтобы решить проблему, я создаю настраиваемое поведение в functions.php, но только для миниатюр, которые еще не созданы и имеют одинаковый размер изображения. Как поясняет @JackJohansson, эта функция работает в фильтре wp_generate_attachment_metadata.

 add_filter('wp_generate_attachment_metadata', 'same_size_image'); function same_size_image($meta){ global $_wp_additional_image_sizes; $file = wp_upload_dir(); $file = trailingslashit($file['basedir']).$meta['file']; $info = getimagesize($file); $image = wp_get_image_editor($file); foreach ($_wp_additional_image_sizes as $label => $op) { if (!isset($meta['sizes'][$label])) { $width = $op['width']; $height = $op['height']; $new_file_path = preg_replace('/\.(.+$)/', '-'.$width.'x'.$height.".$1", $file); if ($info[0] == $width) $image->save($new_file_path); } } return $meta; } 

WordPress должен автоматически создавать все указанные размеры изображения при его загрузке в медиа-библиотеку. По заданному я имею в виду размеры, которые предоставляются родительскими и / или дочерними темами:

 add_image_size('name', 320, 200); 

.. наряду с любыми стандартными по умолчанию WP. Вышеприведенный пример – простой пример создания производной изображения для WP. Если вы хотите, чтобы он каждый раз создавал эскиз заданного размера, вы можете вызвать его в файле functions.php (или включить файл, который вызывает ваша тема).

Вы ищете определенный размер или только 100×100 по умолчанию?

Привет, я не уверен, что это то, что вы ищете, но я думаю, что это поможет

add_image_size( 'thumbnail', '100px', '100px', true );

используйте либо true либо FALSE заявление, чтобы уменьшить изображение или не изменять размер изображения, приведенный выше код создаст изображение почти точно 100px x 100px. для всех изображений, как бы маленькая прогулка вокруг не нуждалась в том, чтобы надеть css.