WordPress как на ладони
wordpress jino

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

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

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

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

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

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

Прежде чем отключать промежуточные размеры, может понадобится убедиться о всех ли размерах вы знаете и какие размеры вообще разрегистрированны на сайте. Чтобы это сделать, добавьте самописную функцию get_image_sizes() из описания get_intermediate_image_sizes() в файл темы functions.php и вызовите её где-то в теме, так вы увидите какие на сайте существуют размеры.

Код функции get_image_sizes():

/**
 * Получает информацию обо всех зарегистрированных размерах картинок.
 * 
 * @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;
}

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

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

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

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

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

Как видите на картинке, мой тестовый блог (тема twentyfourteen) создал 5 копий. Где 3 это копии по умолчанию, а 2 остальные - это настройки темы. Чтобы отключить генерацию копий по умолчанию, зайдите в Настройки > Медиафайлы и поставьте ноль только для крупного размера.

Страница настроек Медиафайлы

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

Размер medium_large, создаваемый по умолчанию с версии 4.4 отключить через админ-интерфейс невозможно. Для отключения используйте хук ниже.

#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", чтобы удалить все копии и оставить только оригиналы и создать копии заново, на основе новых настроек.

Отключаем создание копий картинок в 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' );
    • Kama4192

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

      В общем, с версии 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
      • campusboy1381 cайт: wp-plus.ru
        @

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

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

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

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

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

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

          Ответить4 месяца назад #
      • Артем

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

        Ответить3 месяца назад #
      • Александр

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

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

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

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

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

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

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

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

          Ответить3 месяца назад #
          • Александр

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

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

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

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

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

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

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

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

    Ответитьмесяц назад #
    • 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"

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

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

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

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

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

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

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

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

    Ответить18 дней назад #
    • Kama4192

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

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

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

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

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

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

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

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

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