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

Как отключить адаптивные размеры картинок (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
Гость 1.6 года назад
  • 0
    Kama4660

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

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

    /**
     * Отключаем 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 ко всем картинкам в тексте записи
    remove_filter('the_content', 'wp_make_content_images_responsive' );
    
    // Очищаем атрибуты из wp_get_attachment_image(), если по каким-то причинам они там остались...
    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;
    }
    

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

    Фильтр 'wp_get_attachment_image_attributes' в этом коде в принципе не нужен. Он на всякий случай...

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

    BigDimoz 1.6 года назад

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

    Andreyolex 6 месяцев назад

    А как сделать так, чтоб путь в урлах 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 6 месяцев назад

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

    Для этого есть специальная функций 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 6 месяцев назад

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

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