@levkoi

Как выводить webp при посадке верстки на wordpress?

В верстку изначально были добавлены изображения формата webp для браузеров, его поддерживающих. Ниже кусок кода интересующего нас блока каталога, разметка в нем может быть только такой, тег picture не катит для плагина fotorama.
<a data-href-webp="big.webp" data-href-png="big.png>">
<img src="small.png" alt="alt">
</a>

Проверка осуществлялась через библиотеку Modernizr
Modernizr.on('webp', function (result) {
let a = document.querySelectorAll('.catalog a');
for (let i = 0; i < a.length; i++){
if (result) {
a[i].href = a[i].getAttribute('data-href-png');
}
else {
a[i].href = a[i].getAttribute('data-href-png');
}
}
});

При посадке на Вордпресс был создан новый тип поста через register_post_type, картинки для каталога выводятся с помощью ACF - Изображение.
В functions.php прописана функция, которая конвертирует в webp все загруженные изображения, не меняя имя, но добавляя расширение в конец. (взята отсюда - https://gist.github.com/egmalt/6da5602efd953d3596e...
Пытаюсь сделать вывод изображений в верстку таким образом:
<?php 

$image = array();

// всего нужно 5 изображений
for($i=1;$i<=5;$i++){

//поля называются pic_1_1 - pic_5_1
$image[$i] = get_field('pic_'.$i.'_1');
if( !empty($image[$i]) ): 
// vars
$url[$i] = $image[$i]['url'];
$alt[$i] = $image[$i]['alt'];

$urlWebp[$i] = str_replace('.png', '.png.webp', $url[$i]);
//если выводить в консоль $urlWebp[$i], то получаем нужный нам url, по которому и размещается webp

$imageWebp[$i]=$image[$i];
$imageWebp[$i]['url']=$urlWebp[$i];

// thumbnails
$sizeBig = 'catalog-big';
$sizeSmall = 'catalog-small';
$thumbBig[$i] = $image[$i]['sizes'][ $sizeBig ];
$thumbSmall[$i] = $image[$i]['sizes'][ $sizeSmall ];
$thumbBigWebp[$i] = $imageWebp[$i]['sizes'][ $sizeBig ];
$thumbSmallWebp[$i] = $imageWebp[$i]['sizes'][ $sizeSmall ];

?>
<?php endif; ?>
//вывод в верстку:
<a data-href-webp="<?php $thumbBigWebp[$i]; ?>" data-href-png="<?php echo $thumbBig[$i]; ?>">
<img src="<?php echo $thumbSmall[$i]; ?>" alt="<?php echo $alt[$i]; ?>">
</a>
<?php }; ?>

Все это внутри цикла вывода постов.

Этот код работает, но выводит из админки только png. Подозреваю, что если был загружен png, то и вывести через get_field() можно только его. Как можно это обойти? Или проще каким-то другим способом добавить webp?
  • Вопрос задан
  • 285 просмотров
Пригласить эксперта
Ответы на вопрос 2
wppanda5
@wppanda5 Куратор тега WordPress
WordPress Mедведь
Использовать webp - дрочь и нафиг не надо
но если сильно хочется и picture не устраивает то вариантов без работ на сервере - 2

1. При выводе проверяем USER AGENT и если он поддерживает webp https://caniuse.com/#feat=webp , то отдаем в адресе webp если нет, то обычное.
2. Используем СDN которые это умеют делать сами, fotorama рекомедует uploadcare.com
Ответ написан
Комментировать
@levkoi Автор вопроса
Спасибо за ответ, но не помогло. Вопрос как раз был в том, как осуществить п.1 из ACF.
К сожалению, похоже, получается, что поддерживать одновременно и lazy loading, и webp с фолбэком в блоках фоторамы невозможно, поэтому обошлись изменением разметки фоторамы на
<a href="big.jpg" data-thumb="small.jpg"></a>
для сохранения lazy loading и установкой плагина webP Express для всех остальных изображений (т.к. webP Express не меняет url тега a, только img)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы