Почему WordPress автоматически обрезает все мои изображения?
Я новичок в WordPress, и когда я загружаю любое изображение, WordPress автоматически обрезает его до своих собственных размеров, которые я не указывал в разделе медиа (Настройки » Медиафайлы).
Настройки, которые я сохранил в медиа:
А когда я проверяю директорию, он автоматически обрезает до следующих размеров:
Как это происходит?

WordPress по умолчанию создает 3 типа обрезки для любых загружаемых изображений (Медиафайлов):
- Миниатюра (обычно 150px × 150px)
- Средний размер (обычно 300px × 300px)
- Большой размер (обычно 1024px × 1024px)
Это сделано для обеспечения скорости сайта, используя разные размеры там, где это необходимо. Таким образом, при загрузке исходного изображения будет создано как минимум 4 файла:
- Оригинальный файл (без обрезки),
- Большой размер,
- Средний размер,
- Миниатюра.
Как вы уже знаете, в /wp-admin/options-media.php
можно изменить размеры стандартных обрезок. Таким образом, вы можете использовать стандартные размеры для своих целей. Но если вам нужен новый размер, отличный от трех стандартных, WordPress также позволяет добавлять собственные размеры изображений.
Используя функцию add_image_size()
с нужными параметрами, вы можете добавить новый размер для вашего сайта. Добавьте эту функцию в файл functions.php
, чтобы создать свой размер изображения:
add_image_size( $name, $width, $height, $crop );
Где —
$name
: строка — укажите имя в одинарных кавычках, например 'portfolio'
$width
: целое число — укажите ширину, например 500
(в пикселях)
$height
: целое число — укажите высоту, например 300
(в пикселях)
$crop
: логическое — укажите true
, если нужно жестко обрезать изображение, иначе используйте false
Обычно мы можем выводить миниатюры записи в любом месте темы с помощью:
the_post_thumbnail( 'medium' ); //выведет изображение среднего размера
Если вы хотите использовать свой новый размер, вызовите:
the_post_thumbnail( 'portfolio' ); //если размер назван 'portfolio'
ВНИМАНИЕ: Поскольку WordPress по умолчанию создает 3 настраиваемых размера изображений, для каждого изображения генерируется 4 файла. Добавление новых размеров увеличит количество файлов на хостинге. Использование большего числа размеров изображений может стать проблемой для места на хостинге — это займет больше дискового пространства.
ПРАВКА
После добавления каждого нового размера изображения очень полезным будет следующий плагин:
» Regenerate Thumbnail — Плагин WordPress
На самом деле новый размер изображений будет доступен только для вновь загружаемых изображений. Чтобы применить новый размер ко всем ранее загруженным изображениям, необходимо установить этот плагин и перегенерировать все миниатюры. Это разовая мера, которая будет работать постоянно*.
Основная причина обрезки изображений:
Скорость сайта: WordPress обрезает изображения для увеличения скорости загрузки. Если вы используете Google PageSpeed, то знаете, что он рекомендует:
Оптимизируйте размер изображений
Правильный подбор размеров изображений может сэкономить много трафика.
Подробнее
ПРАВКА 2
Как уже говорилось, если ваш плагин использует функцию add_image_size()
, он может создавать новый размер изображений. После отключения плагинов, если вы используете плагин Regenerate Thumbnails для перегенерации миниатюр, вы получите актуальные размеры. Если это не помогло, проверьте файл functions.php
вашей темы или другие файлы функций на наличие add_image_size()
, и теперь вы знаете, что делать.

Да, WordPress изменяет размер и обрезает все изображения в зависимости от того, что определено в вашей теме, как уже объяснил @Gerard в своем ответе. Последний булев аргумент в add_image_size()
определяет, нужно ли обрезать изображение. Обратите внимание, что это не определяет позицию обрезки. Чтобы изменить это поведение, ознакомьтесь с этим ответом, например.
Что происходит внутри ядра?
Как вы уже видели в исходном коде add_image_size()
, WordPress использует глобальную переменную $_wp_additional_image_sizes
для хранения и обработки настроек генерации ваших изображений. Когда вы загружаете изображение, в игру вступает класс WP_Image_Editor
и — в зависимости от включенных PHP-расширений на вашем сервере — вызывает либо WP_Image_Editor_GD
, либо WP_Image_Editor_Imagick
. Оба этих класса-одиночки (Singletons) имеют метод resize()
, который вызывает image_resize_dimensions()
. В итоге, image_resize_dimensions()
не изменяет размер или обрезает изображение. Она только вычисляет значения.
Это делается методом crop()
в классе Imagick и с использованием нативной PHP-функции imagecopyresampled()
внутри класса GD.
Как отключить обрезку?
Во-первых, у нас есть множество возможностей:
- определить, какой класс используется (какое PHP-расширение поддерживается), а затем перехватить то, что используется для обрезки (см. выше).
- Коротко замкнуть весь процесс и позволить
image_resize_dimensions()
выполнить свою работу.
Мы воспользуемся вторым методом здесь. Не стесняйтесь добавить свое решение как отдельный ответ. Вот что предлагает нам ядро: фильтр, содержащий все параметры.
$output = apply_filters( 'image_resize_dimensions', null, $orig_w, $orig_h, $dest_w, $dest_h, $crop );
Первый аргумент — null
, который сообщает ядру в следующей строке, хотим ли мы переопределить то, что делает эта функция внутри — и заменить ее собственным поведением — или нет. Таким образом, если мы вернем что-либо, кроме null
, это будет использоваться ядром. Помните, что вы можете поместить туда что угодно, но ядро все равно ожидает то же возвращаемое значение, которое использует image_resize_dimensions()
по умолчанию. Из встроенных комментариев:
Возвращаемый массив соответствует параметрам
imagecopyresampled()
:
int dst_x, int dst_y,
int src_x, int src_y,
int dst_w, int dst_h,
int src_w, int src_h
Чтобы просто отключить обрезку, нам пришлось бы заменить (другими словами: клонировать) все внутренности — чего мы хотим избежать. Поэтому мы используем "одноразовый фильтр", который отключает сам себя. Мы делаем это, чтобы использовать внутренности, но просто избавиться от того, что нам не нужно.
<?php
defined( 'ABSPATH' ) or exit;
/* Plugin Name: (#124009) Disable image crop */
add_filter( 'image_resize_dimensions', 'wpse124009DisableCrop', 10, 6 );
function wpse124009DisableCrop( $enable, $orig_w, $orig_h, $dest_w, $dest_h, $crop )
{
// Мгновенно отключаем этот фильтр после первого запуска
remove_filter( current_filter(), __FUNCTION__ );
return image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, false );
}
Теперь обрезка отключена везде. Если вы используете мультисайт или не хотите задумываться о том, включен ли этот плагин, просто используйте его как mu-плагин.
Пожалуйста, учтите, что вышеприведенный код не тестировался, а написан по памяти после прочтения исходного кода ядра.
Дополнительная информация
Больше информации о классах обработки изображений можно найти в слайдах Марко с WordCamp Europe, а видео презентации доступно на WordPress.tv.

kaiser, кто научил тебя всему этому, кто твой наставник? Я хочу стать твоим преданным учеником. :)

@MayeenulIslam Серьезно, ты один из его учеников? Я тоже хочу стать ниндзя в WordPress. Если kaiser (великий мастер) занят, согласишься ли ты взять меня в ученики?

@abhishek360 Упс! ;) Здесь, на этой платформе, каждый является учеником или учителем для другого. Мы все пытаемся чему-то научиться друг у друга. Никого нельзя научить, но обучение происходит изнутри. Оставайтесь на этой платформе, помогайте другим, практикуйтесь больше — здесь много таких, как Kaiser, которые являются нашими учителями. Я всё ещё новичок в WP, и они — мои наставники. ;)

Обычно это происходит потому, что тема WordPress использует миниатюры в своём коде: в циклах, галереях и т.д. Это определяется в файле functions.php:
add_image_size( $name, $width, $height, $crop );
Например, вот так:
add_theme_support('post-thumbnails');
add_image_size('custom-thumbnail', 80, 80, true );
add_image_size('medium-thumbnail', 180, 120, true );
add_image_size('large-thumbnail', 571, 300, true );
Я не рекомендую удалять этот код, если вы действительно хотите сохранить корректную работу вашей темы. Если вы решите удалить его, вам также потребуется убрать вызовы в других файлах, где он используется; обычно это файл loop.php.

так что если я удалю вызовы из loop, galleries страниц, тогда будет использоваться только мой определенный размер? без влияния на мою тему, это возможно?

Да, это так. Определенный размер из вашего первого скриншота будет использоваться, когда вы будете вставлять изображение в запись. Другие размеры, определенные в functions.php, используются как миниатюры/изображения для структуры темы, поэтому высока вероятность, что вам также понадобится настроить CSS.

ох, я не настолько технический специалист, чтобы редактировать где угодно. Можете ли вы посоветовать, что мне сделать, чтобы достичь этого легко, и код, который вы вставили выше — такого не было в моем function.php. Я вставил все это и определил размер. Надеюсь, это сработает.

Ну, если этого нет в functions.php, значит, этот файл содержит 'includes' или 'requires' других файлов, разделяя его содержимое на несколько файлов. Вам нужно просмотреть другие файлы, чтобы удалить функцию, содержащую add_image_size. Если вы добавили код, который я вставил ранее, ваша тема будет создавать больше кропов, чем раньше. PS: Кстати, большинство тем генерируют кропы таким образом, и это становится проблемой только если вам нужно оптимизировать память сервера. Если это необходимо, обрезанные изображения сохраняются в директории 'Uploads'. Не могли бы вы вставить functions.php на Pastebin? Я взгляну :)

Я отключил все плагины, кроме (akismet), и использую тему twenty thirteen. Можете помочь мне дальше? Что мне сделать, чтобы обрезка происходила только до моего заданного размера.

Чтобы отключить обрезку изображений, добавьте следующий код в файл disable-automatic-image-crop.php
в папке mu-plugins:
<?php
/*
Plugin Name: Отключение автоматической обрезки изображений
Author: Сообщество WordPress
Description: https://gist.github.com/czenzel/0f5888cbbfa4a857e56361dd3bc19b39
*/
add_action( 'init', 'czc_disable_extra_image_sizes' );
add_filter( 'image_resize_dimensions', 'czc_disable_crop', 10, 6 );
function czc_disable_crop( $enable, $orig_w, $orig_h, $dest_w, $dest_h, $crop )
{
// Мгновенно отключаем этот фильтр после первого запуска
// remove_filter( current_filter(), __FUNCTION__ );
// return image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, false );
return false;
}
function czc_disable_extra_image_sizes() {
foreach ( get_intermediate_image_sizes() as $size ) {
remove_image_size( $size );
}
}
?>
