27
Окт

Создаём меньше картинок в WordPress

Сам WordPress создаёт четыре разных копии одной и той же картинки под разные нужны. Но в последующем может их не использовать. Естественно со временем объём каталога uploads сильно вырастит.

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

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

Ну и помимо стандартных картинок, дополнительные могут создаваться плагинами и темой, в тот же каталог uploads или другие. В зависимости от настроек админки, обычно это: /wp-content/uploads/, где по годам и месяцам, зайдите в последний год и месяц, там вы должны увидеть файл, который только что загрузили и все его копии с разными размерами:

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

Чтобы узнать какие размеры зарегистрированы на сайте, добавьте следующий код в файл темы header.php или footer.php, заключив код в раздел с <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() ) );[/bash]
Теперь зайдите на сайт и вы увидите подобный массив:

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
)
)[/bash]

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

Зайдите в Настройки > Медиафайлы и поставьте 0 для «крупного» и «среднего» размеров.

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

Размер 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 );[/bash]
Удалите или закомментируйте эту строку, так вы отключите генерацию размера 1038х576.

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

set_post_thumbnail_size( 150, 150 );[/bash]
Её нужно удалить или закомментировать.

#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' );
}
[/bash]
Тут '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',
) );
}
[/bash]

Вариант 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;
} );[/bash]
В этом коде названия: 'blog-large', 'blog-medium' и т.д. - это названия зарегистрированный размеров миниатюр, которые не нужно создавать при загрузке оригинального изображения.

Плагин - Force Regenerate Thumbnails

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