WordPress как на ладони
WordCamp Saint Petersburg 2018 wordpress jino

Отключаем создание копий картинок в WordPress

По умолчанию, WordPress генерирует четыре размера для каждой оригинальной картинки, которую мы загружаем. Темы и плагины могут создавать дополнительные размеры изображений. Таким образом, ваш сайт может создавать от 5 до 10 копий (дублей) каждого загружаемого изображения. Это может увеличить необходимое пространство на диске и размер бэкап файлов. Хорошо, когда все эти копии нужны и используются в теме, однако по факту этого не происходит почти никогда... И поэтому хорошо бы отменить регистрацию дополнительных размеров миниатюр. Как это сделать читайте ниже.

Когда нужно убирать генерацию копий изображений?

Во всех случаях, когда вам не нужны размеры создаваемых дублей. Если вы пользуетесь недорогим хостингом и дисковое пространство на нем ограничено. То стоит проверить, не создаются ли копии картинок, которые не используются в теме. Также, многочисленные дубли загружаемых изображений, которые помещаются в папку uploads, могут значительно увеличить размер бэкап файлов - это как минимум неудобно. Представьте сами, вы загрузили одну картинку, а WordPress создал еще 7 миниатюр к ней - 7 копий этой картинки, при этом некоторые из дублей могут быть почти такого же размера как и оригинал. Если у вас на сайте тысячи картинок, то это может вызвать проблемы и сложности.

Как узнать какие размеры используются на сайте?

По умолчанию WordPress создает четыре копии:

  1. миниатюру (thumbnail)
  2. средний размер (medium)
  3. умеренный большой (medium_large) с версии 4.4.
  4. большой размер (large)

Кроме этих размеров, дополнительные размеры может создавать сама тема. Например, доп. размер для установки миниатюры поста, для постов в боковой панели или для других целей.

Прежде всего, вам нужно определить сколько копий создается при загрузке изображения. Для этого зайдите в админ панель и загрузите изображение большого размера, пусть это будет картинка 1900х1000 пикселей (большой размер нужен для того, чтобы были созданы все возможные копии). Затем зайдите в папку загрузок изображений, обычно это: /wp-content/uploads/. Там файлы сортируются по годам и месяцам, зайдите в последний год и месяц, там вы должны увидеть файл, который только что загрузили и все его копии:

Копии оригинала загружаемых картинок

Как видите на картинке, мой тестовый блог (тема Twenty Fifteen) создал 5 копий. Где 4 это копии по умолчанию, а 1 остальная - это настройки темы.

Узнаем названия каждого размера

Пример с загрузкой изображения, показывает сколько их создается, но не показывает как называется каждый размер. Название (ID) размера нужно знать, чтобы его отключить.

Чтобы узнать какие размеры зарегистрированы на сайте, добавьте следующий код в файл темы header.php или footer.php. Так вы увидите какие на сайте существуют размеры и как они называются.

/**
 * Получает информацию обо всех зарегистрированных размерах картинок.
 * 
 * @global $_wp_additional_image_sizes
 * @uses   get_intermediate_image_sizes()
 * 
 * @param  boolean [$unset_disabled = true] Удалить из списка размеры с 0 высотой и шириной?
 * @return array Данные всех размеров.
 */
function get_image_sizes( $unset_disabled = true ) {
	$wais = & $GLOBALS['_wp_additional_image_sizes'];

	$sizes = array();

	foreach ( get_intermediate_image_sizes() as $_size ) {
		if ( in_array( $_size, array('thumbnail', 'medium', 'medium_large', 'large') ) ) {
			$sizes[ $_size ] = array(
				'width'  => get_option( "{$_size}_size_w" ),
				'height' => get_option( "{$_size}_size_h" ),
				'crop'   => (bool) get_option( "{$_size}_crop" ),
			);
		}
		elseif ( isset( $wais[$_size] ) ) {
			$sizes[ $_size ] = array(
				'width'  => $wais[ $_size ]['width'],
				'height' => $wais[ $_size ]['height'],
				'crop'   => $wais[ $_size ]['crop'],
			);
		}

		// size registered, but has 0 width and height
		if( $unset_disabled && ($sizes[ $_size ]['width'] == 0) && ($sizes[ $_size ]['height'] == 0) )
			unset( $sizes[ $_size ] );
	}

	return $sizes;
}

die( print_r( get_image_sizes() ) );

Теперь зайдите на сайт и вы увидите подобный массив:

Array
(
	[thumbnail] => Array
		(
			[width] => 150
			[height] => 150
			[crop] => 1
		)

	[medium] => Array
		(
			[width] => 300
			[height] => 300
			[crop] => 
		)

	[medium_large] => Array
		(
			[width] => 768
			[height] => 0
			[crop] => 
		)

	[large] => Array
		(
			[width] => 1024
			[height] => 1024
			[crop] => 
		)

	[post-thumbnail] => Array
		(
			[width] => 825
			[height] => 510
			[crop] => 1
		)
)

Как отключить создание копий?

Чтобы отключить генерацию копий по умолчанию, зайдите в Настройки > Медиафайлы и поставьте ноль для «крупного» и «среднего» размеров.

Страница настроек Медиафайлы - оставляем только нужные размеры

ВАЖНО: Размер thumbnail (миниатюра) рекомендую оставить, потому что этот размер используются при создании стандартной галереи и в превью загруженных файлов в админ-панели. Если его убрать, то стандартная галерея не будет работать как положено. А окно медиатеки будет грузить оригиналы файлов, что будет сильно тормозить админку.

Заметка: для отображения картинок в загрузчике медиафайлов при прикреплении картинки к записи, используются средний размер (medium). Но если его нет, используется миниатюра (thumbnail). Поэтому средний размер можно смело отключать.

Размер medium_large, создаваемый по умолчанию с версии 4.4 отключить на странице настроек медиафайлов невозможно. Для отключения используйте хук ниже. Или зайдите на скрытую страницу настроек site.ru/wp-admin/options.php и укажите 0 в настройке medium_large_size_w:

Отключение размера medium_large из админки
#1 Отключение в коде

Остальные 2 копии создаются темой. Обычно код темы отвечающий за генерацию дополнительных размеров можно найти в файле functions.php. Ищите размеры которые вы видели зайдя через FTP (672, 1038, 576) и функцию add_image_size(). Выглядеть она будет примерно так:

add_image_size( 'homepage-thumb', 1038, 576, true );

Удалите или закомментируйте эту строку, так вы отключите генерацию размера 1038х576.

Также за создание копий может отвечать функция set_post_thumbnail_size(), выглядит она так:

set_post_thumbnail_size( 150, 150 );

Её нужно удалить или закомментировать.

#2 Удаление зарегистрированных размеров через фильтр

В версии WordPress 3.9. появилась функция remove_image_size() - позволяет удалить указанный размер миниатюры (физические файлы не удаляются). Теперь, вместо удаления строк, можно отключить ненужные размеры добавив фильтр в файл functions.php:

add_action( 'after_setup_theme', 'remove_plugin_image_sizes', 999 );
function remove_plugin_image_sizes(){
	remove_image_size( 'image-name' );
}

Тут 'image-name' название размера ('homepage-thumb' из примера выше). Удаление вешается на событие after_setup_theme, обычно этого события достаточно. 999 означает что приоритет выполнения функции удаления, поздний, т.е. функция будет вызвана после всех остальных во время этого события.

#3 Отключение создания доп. размеров через фильтр

Варианты ниже могут стать спасением, когда никакой другой не подходит. Оба они практически одинаковые. Они не отключают регистрацию размеров, а просто удаляют их при получении в нужных местах кода.

Вариант 1

Этот вариант более полный, потому что он выключает размеры в нескольких местах, а не только во время загрузки изображения в папку uploads, как это делает второй вариант.

Также плагины работы с изображениями используют функцию get_intermediate_image_sizes() для получения промежуточных размеров. С этим вариантом, такие плагины не увидят ненужных размеров вовсе.

## отключаем создание миниатюр файлов для указанных размеров
add_filter( 'intermediate_image_sizes', 'delete_intermediate_image_sizes' );
function delete_intermediate_image_sizes( $sizes ){
	// размеры которые нужно удалить
	return array_diff( $sizes, array(
		'medium_large',
		'large',
	) );
}
Вариант 2

Этот вариант отключает регистрацию указанных размеров только когда картинка загружается на сайт в папку uploads.

// отключаем создание миниатюр файлов для указанных размеров
add_filter( 'intermediate_image_sizes_advanced', function( $sizes ) {
	unset( $sizes['blog-large'] );
	unset( $sizes['blog-medium'] );
	unset( $sizes['tabs-img'] );
	unset( $sizes['related-img'] );
	unset( $sizes['portfolio-full'] );

	return $sizes;
} );

В этом коде названия: 'blog-large', 'blog-medium' и т.д. - это названия зарегистрированный размеров миниатюр, которые не нужно создавать при загрузке оригинального изображения.

Заключение

Прежде чем использовать материал из этой статьи, нужно убедиться, что удаляемые размеры не используются в текущей теме, в качестве миниатюр для записей, в боковой панели или в других типах постов. Удаляйте создаваемые копии только, когда уверены, что они не нужны для правильной работы темы.

Плагин - Kama Thumbnail

Обратите внимание на мой плагин для создания миниатюр: Kama Thumbnail. C его помощью можно динамически создавать те размеры которые нужны в теме. А загружать только оригиналы. Я так и делаю на всех своих проектах.

Плагин - Force Regenerate Thumbnails

Обращаю внимание, что при отключении размеров миниатюр, сами файлы миниатюр которые лежат в папках НЕ удаляются. Отключается только лишь зарегистрированный размер и при очередной загрузке файла миниатюра с отключенным размером создаваться уже не будет. Чтобы почистить «старые» файлы используйте плагин Force Regenerate Thumbnails. Плагин полностью пересоздаст физические файлы в соответствии с текущими установками для миниатюр.

Отключаем создание копий картинок в WordPress 67 комментов
Полезные 10 Вопросы 2 Все
  • Виталий cайт: www.piskarew.ru

    Сколько лет работаю с пресом про скрытую страницу wp-admin/options.php первый раз слышу... Спасибо большое за инфу, все убрал без плагинов, а так вообще создавалось только две копии большого img и миниатюры.

    И в файле functions.php

    и в срытой странице wp-admin/options.php поставил 0 на medium_large_size_w благодаря Вам

    Еще раз спасибо за информацию. Правильно говорят век живи век учись. good

    Ответить3 месяца назад #
    • Kama5188

      Базовый размер миниатюры оставь лучше, он в админке юзается yes , в статье есть про это...

      Ответить3 месяца назад #
  • Димыч cайт: dveimperii.ru

    При переносе сайта с самописной CMS на вордпресс, сайт вырос с 3Гб до 6.5Гб. Я в шоке. Оказалось вордпресс из одной фотки делал 16!!

    Ответить3 месяца назад #
  • Андрей cайт: 2

    привет подскажите как удалить через файл функций темы доп размеры создаваемых темой ???

    110x75.jpg
    310x165.jpg
    310x205.jpg
    500x330.jpg

    -1
    Ответить2 месяца назад #
  • @ BigDimoz15 cайт: pribylvseti.ru

    Тимур привет. Спасибки за материал полезный. А есть ли возможность в "Вордпресс" при загрузке, автоматически "обтёсывать" оригиналы под определённую ширину? Пример. Есть партнёрская площадка у меня под маркет. Процесс: выбираю нужные товары (в плагине), жму импорт и понеслась загрузка карточек товаров. Так вот иногда у них изображения (оригиналы) проскакивают просто отпад, 3-4 Мб (4000х3000, как пример) одно, хотя для вывода нужно максимум 530 шириной и весят такие 80-120 кб. Товаров на сайте тыщы! Приходится скачивать "жирных" с хостинга и ручками резать, а потом обратно, иначе они место отжирают неприлично много.

    1
    Ответить2 месяца назад #
    • Kama5188

      Я пользуюсь плагином Compress JPEG & PNG images там можно указать макс ширину и высоту для загружаемых фоток, ну и главная его задача оптимизировать потом загруженные фоты.

      Ответить2 месяца назад #
  • newbie23 cайт: yumchief.com

    Для тех, кто использует плагин Recent Post Widget Extended:
    что бы убрать генерацию миниатюры 45х45 px, которая создается этим плагином, нужно добавить в functions.php вашей темы код:

    function rpwe_remove_image_size() {
    	remove_image_size( 'rpwe-thumbnail' );
    }
    add_action( 'init', 'rpwe_remove_image_size' );
    Ответитьмесяц назад #
  • Roman cайт: kompsovety.ru

    Спасибо за ценные советы

    3
    Ответитьмесяц назад #
  • @ Gordan

    У меня не получилось сделать. Отключил в опциях. Прописал функцию, загружаю картинку всё равно несколько файлов создаётся.
    Использую тему dynamic-news-lite
    Закоментировал ненужные размеры

    function dynamicnews_add_image_sizes() {
    //создание копий миниатюр файла картинки
    	// Add Custom Header Image Size
    	//add_image_size( 'custom_header_image', 1340, 200, true );
    
    	// Add Featured Image Size
    	//add_image_size( 'featured_image', 860, 280, true );
    
    	// Add Slider Image Size
    	add_image_size( 'slider_image', 880, 290, true );
    
    	// Add Frontpage Thumbnail Sizes
    	//add_image_size( 'category_posts_wide_thumb', 420, 140, true );
    	add_image_size( 'category_posts_small_thumb', 90, 90, true );
    
    	// Add Widget Post Thumbnail Size
    	//add_image_size( 'widget_post_thumb', 75, 75, true );
    
    }

    Всёравно при загрузке создаётся несколько картинок с размерами.
    Прописал функцию фильтр.

    function delete_intermediate_image_sizes($sizes){
    	//размеры которые нужно удалить
    	return array_diff($sizes, array(
    		'medium_large',
    		'large',
    		'category_posts_wide_thumb',
    		'widget_post_thumb',
    	));
    }
    add_filter('intermediate_image_sizes', 'delete_intermediate_image_sizes');

    Подскажите, что ещё можно сделать. scratch_one-s_head

    Ответитьмесяц назад #
  • Евгений

    А что делать, если только что поставленный вордпресс делает только одну картинку? А мне нужно несолько вариантов. В functions.php все включено, в админке тоже.
    Версия 4,9,4 Английская.

    Ответитьмесяц назад #
    • Евгений

      Сам спросил, сам ответил. Не стояла нужная библиотека в php. Вот ответ:

      Use php -v cmd to find php version you are using, and then install gd. In my case it was 7.1. So I did sudo apt install php7.1-gd and restart apache sudo service apache2 restart

      2
      Ответитьмесяц назад #
  • @ Анатолий

    Уважаемый Тимур!!!
    Ваш сайт достоин золотой медали от блоггеров на WordPress.
    Самые наболевшие проблемы, и как правильно от них избавиться я нахожу на Вашем удивительно-полезном сайте.
    Здоровье и процветания как Вашем блогу, так и Вам лично.
    Браво!!!!!!!!!!

    2
    Ответить29 дней назад #
  • Алекс

    Спасибо автору за статью! Материал интересный.
    Подскажите пож-ста, как решить такую задачу. После масштабирования медиафайла ему задаются некие размеры, которые никак не получается отредактировать(в большую сторону), кроме как удалить файл и залить заново. Напр: фото 400 на 400, вес от 500 кб, а на сайте отображается маленькая картинка из-за этих заданных размеров. Все перерыл, но изменить эти размеры не получается...
    Может кто уже сталкивался с этим. Заранее большое спасибо!

    Ответить15 дней назад #

Здравствуйте, !

Ваш комментарий
Предпросмотр