WordPress как на ладони
Готовые темы (шаблоны) для WordPress wordpress jino

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

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

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

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

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

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

По умолчанию 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
		)
)

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

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

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

«Размер миниатюры» и «средний» рекомендую оставить, потому что эти размеры используются при создании стандартной галереи и в превью загруженных файлов в админ-панели. Если убрать эти размеры, то стандартная галерея не будет работать как положено. А превьюшки загруженных файлов в админ-панели будут загружаться долго, т.к. WP будет грузить оригиналы картинок.

Размер 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:

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

Тут '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. C его помощью можно динамически создавать те размеры которые нужны в теме. А загружать только оригиналы. Я так и делаю на всех своих проектах.

Плагин

Если вы вносите изменения на уже рабочем сайте с загруженными картинками. То можно воспользоваться плагином Force Regenerate Thumbnails, чтобы удалить все копии и оставить только оригиналы и создать копии заново, на основе новых настроек.

Перевозки грузов

перевозки грузов

bryansk.dellin.ru

Отключаем создание копий картинок в WordPress 35 комментариев
Полезные 4 Вопросы 3 Все
  • Виктор
    @

    Здравствуйте, Kama, подскажите пожалуйста, как реализовать чтобы дополнительные размеры появлялись только у миниатюр, а не у картинок (загруженных медиафайлов к статьям). Имеется такой код в functions.php:

    add_theme_support( 'post-thumbnails' );
    set_post_thumbnail_size( 223, 137, true );
    add_image_size( 'schema-featured', 680, 350, true ); //featured
    add_image_size( 'schema-related', 211, 150, true ); //related
    add_image_size( 'schema-widgetthumb', 70, 60, true ); //widget
    add_image_size( 'schema-widgetfull', 300, 200, true ); //sidebar full width
    add_image_size( 'schema-slider', 772, 350, true ); //slider

    Благодарю за ответ.

  • Тимур, вы должно быть уже в курсе, что в последней версии WordPress 4.6 к любому загружаемому в библиотеку изображению автоматически, независимо от настроек движка, генерируется копия с размером по ширине 768 пикселей? Зачем это, непонятно. Знаете ли вы что нибудь по этому вопросу, а именно, как отключить это действие? Я пробовал следующий код, но даже на чистом wordpress все равно создается копия оригинального изображения с размерами 768px:

    function default_image_sizes($sizes) {
    
    	unset( $sizes['thumbnail'] );
    	unset( $sizes['medium'] );
    	unset( $sizes['large'] );
    
    	return $sizes;
    
    }
    
    add_filter( 'intermediate_image_sizes_advanced', 'default_image_sizes' );
    • Kama4349

      Да в курсе, в статье это есть, я обновил там код...

      В общем, с версии 4.4. появился еще один размер по-умолчанию medium_large. Причем он в настройках нигде не фигурирует, а есть только в коде.

      Отключить его генерацию, проще всего через вышеупомянутый фильтр, а еще лучше через 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',
      	) );
      }

      П.С. thumbnail и medium не удаляй! Они в админке юзаются, если удалить будет в медиатеке в превью оригиналы грузить...

      4
      • campusboy1455 cайт: wp-plus.ru
        @

        Не я один такой, кто уткнулся в этот баг, то есть фичу, прошу прощения. Большое человеческое спасибо!

        2
      • а я крышу рву - ищу где в теме размеры заложены ! Спасибо!

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

        • Kama4349

          Это как? Миниатюра поста сама по себе дубль, копия, размер... Дубли (миниатюры) создаются во время загрузки картинки в метиатеку. А миниатюра выставляется уже после, причем её можно изменить... В вопросе нет логики...

          Если нужны только используемые размеры и ничего лишнего, то установи мой плагин kama thumbnail, немного в нем разберись, потом наверное спасибо скажешь unknw

      • Артем

        Спасибо тебе большое и человеческое, а то я уже заманался искать как отключить эти 768 пикселей

      • Александр

        У меня wordpress 4.7, использую плагин Envira Gallery.

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

        09_12_2016_sobytie_07-640x480.jpg
        09_12_2016_sobytie_07-1280x960.jpg

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

        Ваш способ с "## отключаем создание миниатюр файлов для указанных размеров" тут может помочь? И если да, то в какой именно файл нужно вставить вышеприведенные строки?

        • Kama4349

          Насчет в 2 раза больше чем исходный - это очень странно. Похоже это плагина дела, я не знаю что WP может увеличивать оригинальный размер...

          Может другой плагин поискать? Если не вариант, то надо разбираться судя по всему... unknw

          • Александр

            хочу попробовать вставить Ваш код
            в какой именно файл его следует поместить?

            • Kama4349

              В статье же есть... смотри пример "2 Удаление зарегистрированных размеров через фильтр"

  • Yuriy

    Благодарю за статью, в данный момент обрабатываю библиотеку с помощью Force Regenerate Thumbnails.

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

    Если я добавляю новое изображение в статью изображение видно в окне редактирования, на сайте снова не видно, код такой:

    Буду очень благодарен за помощь.

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

      Благодарю за статью, в данный момент обрабатываю библиотеку с помощью Force Regenerate Thumbnails.

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

      <a href="http://www.site.com/wp-content/uploads/2017/02/FullSizeRender-30-01-17-23-58.jpg"><img class="aligncenter size-large wp-image-34033" src="http://www.site.com/wp-content/uploads/2017/02/FullSizeRender-30-01-17-23-58-760x1024.jpg" alt="" width="625" height="842" /></a>

      Если я добавляю новое изображение в статью изображение видно в окне редактирования, на сайте снова не видно, код такой:

      <img class="aligncenter size-full wp-image-34029" src="http://www.site.com/wp-content/uploads/2017/02/FullSizeRender-30-01-17-23-50-4.jpg" alt="" width="3068" height="2200" />

      Буду очень благодарен за помощь.

      --

      Из сделанного:

      1) в functions.php закомментированы строки

      #   add_theme_support( 'post-thumbnails' );
      #   set_post_thumbnail_size( 624, 9999 ); // Unlimited height, soft crop

      И добавлен код

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

      2) в настройка галереи поставил везде "0"

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

      Теперь нужно решить вопрос с показом изображений в старых статьях.

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

        Ну так ты удалил картинки, как же они показываться будут? Теперь ссылка вида .../2017/02/FullSizeRender-30-01-17-23-58-760x1024.jpg битая... Тебе нужно у таких ссылок удалить -760x1024 пусть смотрят на оригинал. Наверное руками не знаю, если много картинок нужно регулярку писать аккуратно и обработать все статьию ею... Пиши в личку, если не сможешь сам сделать, буду помогать за оплату...

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

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

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

    Можно ли задать, что бы миниатюры создавались только для определенных типов постов,
    , например для service_post только add_image_size('image-760', 760, 9999); для client_post add_image_size('image-455-455', 455, 455, array('center', 'top'));

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

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

      http://wordpress.stackexchange.com/questions/4563/add-image-size-for-specific-post-types

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

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

    Здравствуйте, Тимур!
    Благодарю Вас за интересный ресурс и, в частности, за данную статью smile
    Окажите любезность, подскажите, пожалуйста, в какой части файла functions.php нужно добавить функцию get_image_sizes() и как затем вызвать её где-то в теме?
    Заранее прошу прощения за нелепые, на взгяд продвинутых пользователей, вопросы и очень надеюсь на Ваш ответ. blush Спасибо!

    Ответить2 месяца назад #
    • Kama4349
      1. В любой части, только не внутри какой-то функции, с этим ознакомься.

      2. Затем вызови, например, в файле header.php. Суть в том, что вам нужно посмотреть имеющиеся размеры, затем функцию нужно отключить.
      <?php
      $sizes = get_image_sizes();
      die( '<pre>'. print_r( $sizes, 1 ) .'</pre>' );
      ?>
      Ответить2 месяца назад #

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

Ваш комментарий