Как отключить адаптивные размеры картинок (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 );
Но что-то мне подсказывает, что это не самое лучшее решение.
Подскажите пожалуйста как выключить эти лишние атрибуты правильно.
Да, вариант который вы выложили - это костыль, который после всех операций удаляет атрибуты, да и то мне кажется не везде...
На одном из своих сайтов я использую такой код:
/** * Отключаем 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; }Посмотрел в "наших интернетах" ответ на этот вопрос и нашел аналогичный код здесь
Тимур, поставил твой код на двух блогах и вполне норм он чистит, просто до этого стрёмного как-то на исходный код страницы было смотреть, куча ссылок на различные размеры изображений. Мне кажется адаптивность картинок девелоперам иначе реализовать надо, и так движок сам по себе стругает три размера, захламляя сайт и забирая место, причём по умолчанию, была бы ещё возможность выключить.
А как сделать так, чтоб путь в урлах 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?
Так тебе походу не только протокол нужно удалить, но и домен... т.е. сделать ссылку относительной.
Для этого есть специальная функций 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; }Спасибо. Заработало. Предыдущий код был взят с какого-то сайта, а я не настолько разбираюсь в php и wordpress, чтоб его довести до ума ((.