По умолчанию WordPress очень активно вмешивается в процесс загрузки изображений: сжимает JPEG, обрезает картинки больше 2560px, генерирует с десяток промежуточных размеров и даже крутит их по EXIF-данным.
Для большинства клиентских проектов это полезно. Но когда требуется создать портфолио фотографа, каталог высокоточных текстур или проект, где качество оригинала — закон, стандартное поведение движка становится проблемой.
Давайте разберем мощный сниппет, который заставляет WordPress сохранять изображения ровно в том виде, в котором они были загружены, и предотвращает падение сервера при работе с тяжелыми исходниками.
Разбор кода по шагам
1. Отключаем сжатие JPEG
По умолчанию WP сжимает JPEG-файлы до 82-90% от оригинала. Чтобы сохранить 100% качество, мы фильтруем функции качества.
PHP
// Отключаем сжатие JPEG (Качество от 1-100)
add_filter( 'jpeg_quality', function() { return 100; } );
add_filter( 'wp_editor_set_quality', function() { return 100; } );
Важно: Использовать несуществующую функцию
__return_max_intздесь нельзя — это вызовет фатальную ошибку. Явно возвращаем100через анонимную функцию.
2. Отменяем масштабирование огромных изображений (-scaled)
Начиная с версии 5.3, WordPress автоматически уменьшает любые картинки шире или выше 2560 пикселей, добавляя к имени файла суффикс -scaled. Отключаем эту "заботу":
PHP
// Запрещаем WordPress создавать уменьшенные версии оригиналов
add_filter( 'big_image_size_threshold', '__return_false' );
3. Блокируем генерацию миниатюр
Каждая загруженная картинка обычно превращается в 5-7 дополнительных файлов (Thumbnail, Medium, Large и т.д.). Если вы выводите только оригиналы (например, через ACF галереи или кастомные блоки), эти дубли просто съедают место на сервере.
PHP
// Убираем все промежуточные размеры при загрузке
add_filter( 'intermediate_image_sizes_advanced', '__return_empty_array' );
// На всякий случай жестко удаляем стандартные размеры,
// которые могут переопределяться темами или плагинами
add_action( 'init', function() {
remove_image_size( 'thumbnail' );
remove_image_size( 'medium' );
remove_image_size( 'large' );
remove_image_size( 'medium_large' );
remove_image_size( '1536x1536' );
remove_image_size( '2048x2048' );
});
Первый фильтр пресекает генерацию на корню, а хук init страхует нас от "упрямых" тем (особенно актуально для тяжелых премиум-шаблонов), которые регистрируют свои размеры.
4. Запрещаем модификацию по EXIF
Иногда телефоны сохраняют фото боком, прописывая правильную ориентацию в метаданных EXIF. WP пытается исправить это, физически поворачивая картинку и пересохраняя её (что снова ведет к пережатию). Запрещаем:
PHP
// Предотвращаем любые модификации оригинала
add_filter( 'wp_image_maybe_exif_rotate', '__return_false' );
5. Обходим ошибку «Сервер не может обработать изображение»
Загрузка исходников по 10-20 Мегабайт требует колоссальных ресурсов оперативной памяти во время работы PHP-скриптов и библиотек GD/ImageMagick. Если лимитов не хватает, загрузка прервется с ошибкой HTTP.
PHP
// Динамически пытаемся увеличить лимиты памяти и времени выполнения для PHP
@ini_set( 'memory_limit', '512M' );
@ini_set( 'max_execution_time', '300' );
Символ @ подавляет предупреждения, если ваш хостинг-провайдер заблокировал функцию ini_set по соображениям безопасности (что часто бывает на shared-тарифах). Если конфигурация сервера (например, Nginx + PHP-FPM) позволяет переопределение, этот блок спасет вас от 500-х ошибок.
⚠️ Ложка дегтя: SEO и производительность
Внедряя этот код, помните о последствиях:
- PageSpeed Insights будет недоволен: Отдача 10-мегабайтных оригиналов без адаптивных размеров (
srcset) убьет показатели LCP (Largest Contentful Paint). - Трафик: Мобильные пользователи с медленным интернетом не скажут вам спасибо.
Когда это оправдано?
Этот сниппет идеален, если вы разрабатываете закрытую систему управления медиа, файловый архив, сайт для продажи стоковых фотографий в исходном качестве, или если оптимизация (конвертация в WebP/AVIF, ресайз) происходит на стороне балансировщика нагрузки или продвинутого CDN, а WordPress выступает исключительно как хранилище эталонных оригиналов.
Лучший вариант использования - включение этого сниппета по необходимости, для загрузки оригинальной фотографии без сжатия.
Весь код целиком
// 🔹 Отключаем сжатие JPEG (Качество от 1-100. Использовать несуществующую функцию __return_max_int нельзя, это вызовет ошибку)
add_filter( 'jpeg_quality', function() { return 100; } );
add_filter( 'wp_editor_set_quality', function() { return 100; } );
// 🔹 Запрещаем WordPress создавать уменьшенные версии оригиналов (без -scaled)
// Именно это отключает принудительное сжатие фото больше 2560px
add_filter( 'big_image_size_threshold', '__return_false' );
// 🔹 Убираем все промежуточные размеры (миниатюры и т.п.)
add_filter( 'intermediate_image_sizes_advanced', '__return_empty_array' );
// 🔹 На всякий случай убираем стандартные размеры, созданные темами и плагинами
add_action( 'init', function() {
remove_image_size( 'thumbnail' );
remove_image_size( 'medium' );
remove_image_size( 'large' );
remove_image_size( 'medium_large' );
remove_image_size( '1536x1536' );
remove_image_size( '2048x2048' );
});
// 🔹 Предотвращаем любые модификации оригинала (например, поворот EXIF)
add_filter( 'wp_image_maybe_exif_rotate', '__return_false' );
// =====================================================================
// 🔹 ОБХОДА ОШИБКИ «СЕРВЕР НЕ МОЖЕТ ОБРАБОТАТЬ ИЗОБРАЖЕНИЕ»
// =====================================================================
// Динамически пытаемся увеличить лимиты памяти и времени выполнения для PHP
// (Сработает, если хостинг не блокирует функцию ini_set)
@ini_set( 'memory_limit', '512M' );
@ini_set( 'max_execution_time', '300' );
