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

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

По умолчанию, WordPress генерирует 3 размера для каждой оригинальной картинки, которую мы загружаем. Темы и плагины могут создавать дополнительные размеры изображений. Таким образом, ваш сайт может создавать от 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
		)
)

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

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

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

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

Заметка: для отображения картинок в загрузчике медиафайлов при прикреплении картинки к записи, используются средний размер (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. C его помощью можно динамически создавать те размеры которые нужны в теме. А загружать только оригиналы. Я так и делаю на всех своих проектах.

Плагин - Force Regenerate Thumbnails

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

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

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

bryansk.dellin.ru

Отключаем создание копий картинок в WordPress 51 комментарий
Полезные 5 Все
  • Роман

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

    • Kama4488

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

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

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

  • Natalia

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

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

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

    Здравствуйте не поможете разобраться. Есть сайт https://хороший-копирайтер.рф создает много картинок, как понять какие не нужные? Установил плагин WP Smush он мне показал что у меня такие картинки:
    'thumbnail',
    'medium' ,
    'large',
    'llorix-one-lite-post-thumbnail-latest-news',
    'medium_large'
    как понять какие нужны, а какие нет? Как понять где какие используются? Какие можно удалить а какие оставить? Надеюсь вы поможете мне. Мне бы разобраться какие оставлять а какие можно удалять, я бы и вручную почистил. При загрузки создаются такие картинки:
    Веб-райтинг-150x150.jpg
    Веб-райтинг-157x157.jpg
    Веб-райтинг-400x300.jpg
    Веб-райтинг-510x153.jpg
    Веб-райтинг-730x300.jpg
    Веб-райтинг-768x230.jpg
    Веб-райтинг.jpg

    С уважением.

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

      Еще раз эту статью прочитай и посмотри хорошо где какие размеры используются - просто полазив по сайту...

      Ответить3 месяца назад #
  • Доброго времени)))

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

    Спасибо smile

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

      Для этого есть плагин imsanity

      Ответить3 месяца назад #
      • А без плагина, в wordpress-е не предусмотрено такое?
        Может быть тогда можно с помощью - unlink() средствами PHP такое сделать. Из-за такой простой операции целый плагин подключать.

        Не нравится то, что вордпресс может загрузить картинку и мегабайт и больше наверное. Ограничений тоже нет никаких?

        И еще вопрос. Как сделать, чтобы при добавлении изображения, в редактор устанавливалось изображение - Large, т.е. - 1024px? То есть оригинал я буду удалять, а изображению, которое будет уменьшено буду добавлять теги, чтобы работал скрипт увеличения по клику картинки.

        Спасибо.

        Ответить3 месяца назад #
        • Помог вот такой хук

          add_filter( 'wp_generate_attachment_metadata', 'delete_fullsize_image' );
          function delete_fullsize_image( $metadata )
          {
          	$upload_dir = wp_upload_dir();
          	$full_image_path = trailingslashit( $upload_dir['basedir'] ) . $metadata['file'];
          	$deleted = unlink( $full_image_path );
          
          	return $metadata;
          }
          

          Сейчас вопрос - Как сделать, чтобы при добавлении изображения, в редактор устанавливалось изображение - Large, т.е. - 1024px?

          Ответить3 месяца назад #
          • campusboy1836 cайт: wp-plus.ru

            Достаточно 1 раз выбрать Large при вставке изображения в редактор и двиг запоминает твой выбор и остальные картинки будет вставлять с таким размером, пока не выберешь другой. Или так не катит?

            Ответить3 месяца назад #
            • Да, действительно, сохраняет. Спасибо smile

              Хук хорош, но есть последствия, размер оригинального изображения все равно регистрируется, хотя само изображение удаляется.

              Может кто знает, как и регистрацию оригинальных размеров убрать?

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

                что за ерунду ты тут вытворяешь... Сорри объяснять не буду подробно, просто такой подход - это неправильно в корне... Оригинальный размер должен быть в ВП он много где фигурирует в функциях, а ты его грохнул, ну, лови баги теперь... И оригинальный размер не регистрируется, он просто есть, ну в твоем случае должен быть crazy

                Ответить3 месяца назад #
                • какую ерунду? я все в файле function.php делаю. Это не движок. А оригинальный размер мне не нужен. Например другие пользователи будут добавлять изображения, кто по мегабайту или больше, с фотоаппарата по 3 мег фото. Вряд ли пользователи будут в фотошопе их редактировать. А хостинг не резиновый ))) . У меня и так там наверное гигов 5 занято.

                  Для сайта фото - 1000 пикселей вполне достаточно.

                  Ответить3 месяца назад #
                  • Кстати. Еще интереснее решение. Функция удаляет оригинал и загружает размер - Large

                    function replace_uploaded_image($image_data) {
                    	// if there is no large image : return
                    	if (!isset($image_data['sizes']['large'])) return $image_data;
                    
                    	// paths to the uploaded image and the large image
                    	$upload_dir = wp_upload_dir();
                    	$uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
                    	$large_image_filename = $image_data['sizes']['large']['file'];
                    
                    	// Do what wordpress does in image_downsize() ... just replace the filenames ;)
                    	$image_basename = wp_basename($uploaded_image_location);
                    	$large_image_location = str_replace($image_basename, $large_image_filename, $uploaded_image_location);
                    
                    	// delete the uploaded image
                    	unlink($uploaded_image_location);
                    
                    	// rename the large image
                    	rename($large_image_location, $uploaded_image_location);
                    
                    	// update image metadata and return them
                    	$image_data['width'] = $image_data['sizes']['large']['width'];
                    	$image_data['height'] = $image_data['sizes']['large']['height'];
                    	unset($image_data['sizes']['large']);
                    
                    	// Check if other size-configurations link to the large-file
                    	foreach($image_data['sizes'] as $size => $sizeData) {
                    		if ($sizeData['file'] === $large_image_filename)
                    			unset($image_data['sizes'][$size]);
                    	}
                    
                    	return $image_data;
                    }
                    add_filter('wp_generate_attachment_metadata', 'replace_uploaded_image');
                    

                    То что нужно)) wink

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

                      Эта функция еще куда не шло... Она хоть оригинальное название файла оставляет и удаляет large размер. Если в ней багов нет...

                      Ну, а в целом, делай как знаешь... Свой совет я уже дал, к которому ты видимо даже прислушаться не захотел...

                      Ответить3 месяца назад #
                    • Дружище, извини, если где-то некорректно себя вел и т.п. Сайт у тебя просто - всемирная библиотека по водрпресс)), сайт в закладках постоянно пользуюсь.

                      Но хранение файлов на хостинге тема больная. В данный момент уже 50% я занял. И хранение обычных изображений по мегабайту и больше, считаю вещью очень расточительной. Вообще много вордпресс чего лишнего делает, например ту же генерацию размеров изображений, которые для адаптивного дизайна явно не нужны.

                      В остальном вордпресс довольно элегантен)) и избавляет от проблемы писать все самому.

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

                      Вот еще совет, пуще прежнего. Ставь плагин Compress JPEG & PNG images там и оптимизация и ограничение макс. размера.

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

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

    <img src="http://адрес сайта/wp-content/uploads/..."/>

    Можно ли сделать так, чтобы ссылка была относительной (такого вида например:

    <img src="//адрес сайта/wp-content/uploads/..."/>

    1
    Ответитьмесяц назад #
  • Inco cайт: Compusers.ru @

    Привет. При вставке кода в footer.php код не выполняется а выводится на странице. Та же история и с header.php

    Ответить4 дня назад #
  • Inco cайт: Compusers.ru @

    появились специальная функция, позволяющая удалить размер миниатюры

    Это функция удалит из папки все ненужные миниатюры?

    Ответить4 дня назад #
    • Kama4488

      Нет, она удалит зарегистрированный размер... Для удаления из папки используй плагин Force Regenerate Thumbnails.

      Читай статью еще раз... Там все это написано...

      Ответить21 час назад #

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

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