eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

Как отключить адаптивные размеры картинок (srcset) в WordPress 4.4?

Всем привет! Вопрос такой.

В версии 4.4. была введена новая фитча: для всех картинок добавляется новый атрибут "srcset" и вроде бы еще к нему в придачу "sizes". Это своего рода промежуточные размеры картинки.

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

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

Нашел в сети такой код для отключения:

add_filter( 'wp_get_attachment_image_attributes', function($attr) {
	if (isset($attr['sizes'])) unset($attr['sizes']);
	if (isset($attr['srcset'])) unset($attr['srcset']);
	return $attr;
}, PHP_INT_MAX );

Но что-то мне подсказывает, что это не самое лучшее решение.

Подскажите пожалуйста как выключить эти лишние атрибуты правильно.

3
Гость
8.7 лет назад
  • 0
    Kama 9778

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

    На одном из своих сайтов я использую такой код:

    /**
     * Отключаем srcset и sizes для картинок в WordPress
     */
    
    // @version 1.0
    if( 'Отключаем srcset и sizes для картинок в WordPress' ){
    
    	// Отменяем srcset
    	// выходим на раннем этапе, этот фильтр лучше чем 'wp_calculate_image_srcset'
    	add_filter( 'wp_calculate_image_srcset_meta', '__return_null' );
    
    	// Отменяем sizes - это поздний фильтр, но раннего как для srcset пока нет...
    	add_filter( 'wp_calculate_image_sizes', '__return_false',  99 );
    
    	// Удаляем фильтр, который добавляет srcset ко всем картинкам в тексте записи
    	// WP < 5.5
    	remove_filter( 'the_content', 'wp_make_content_images_responsive' );
    	// WP > 5.5
    	add_filter( 'wp_img_tag_add_srcset_and_sizes_attr', '__return_false' );
    }
    

    На 100% не уверен что он очищает абсолютно все, но насколько я помню, когда копался в исходных кодах WordPress, то пытался найти самые основные фильтры чтобы все это дело отключить.

    Последнюю версию кода смотрите здесь.

    Дополнительный фильтр, который удаляет атрибуты srcset и sizes в последний момент. в 99% случаев этот хук не нужен, можно добавить на всякий случай.

    // Очищаем атрибуты `srcset` и `sizes`, если по каким-то причинам они остались.
    add_filter( 'wp_get_attachment_image_attributes', 'unset_attach_srcset_attr', 99 );
    function unset_attach_srcset_attr( $attr ){
    
    	foreach( array('sizes','srcset') as $key ){
    		if( isset($attr[ $key ]) )
    			unset($attr[ $key ]);
    	}
    
    	return $attr;
    }

    Посмотрел в "наших интернетах" ответ на этот вопрос и нашел аналогичный код здесь

    BigDimoz 8.7 лет назад

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

    Andreyolex 7.5 лет назад

    А как сделать так, чтоб путь в урлах srcset указывался без http
    Для обычных src у меня используется код

    function attachment_image($attrs)
    {
    	$url_sectors = preg_split('/\//', $attrs['src']);
    	unset($url_sectors[0]);
    	unset($url_sectors[1]);
    	unset($url_sectors[2]);
    	$attrs['src'] = '/'.join('/', $url_sectors);
    	return $attrs;
    }
    add_filter('wp_get_attachment_image_attributes', 'attachment_image');

    Как его видоизменить для srcset?

    Kama 7.5 лет назад

    Так тебе походу не только протокол нужно удалить, но и домен... т.е. сделать ссылку относительной.

    Для этого есть специальная функций wp_make_link_relative(). И не надо такой огород лепить...

    Ну и атрибут srcset меняется также, через фильтр wp_get_attachment_image_attributes. Получиться что-то такое:

    add_filter('wp_get_attachment_image_attributes', 'attachment_image');
    function attachment_image( $attrs ){
    	$attrs['src']    = wp_make_link_relative( $attrs['src'] );
    
    	$attrs['srcset'] = implode(', ', array_map( 'wp_make_link_relative', preg_split('~,\s~', $attrs['srcset']) ) );
    
    	return $attrs;
    }
    
    Andreyolex 7.5 лет назад

    Спасибо. Заработало. Предыдущий код был взят с какого-то сайта, а я не настолько разбираюсь в php и wordpress, чтоб его довести до ума ((.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация