формат webp

WebP — формат изображений для веба, который активно пиарит компания Google. Есть он и есть, казалось бы, много каких форматов есть, если бы не одно но: при проверке через новый гугл-спид за отсутствие онных изображений сильно снижаются оценки. И если вам не приходилось выслушивать от клиентов или сеошников то, что показатели гугл-спида низкие и это срочно нужно поправить, то знайте: вы счастливчик. Ну да это все лирика.

Начнем с проблем с этим форматом:

  1. Большинство графических редакторов с ним не дружат.
  2. phpthumb с ним не дружит
  3. Apple с ним не дружит
  4. С ним вообще никто не дружит, кроме гугла)
Как быть и что с ним делать?

Вариант номер один: забить. Тысячу раз так делал — реально работает и ничего делать не надо)
Вариант номер два, если первый ну вообще никак не получается — последовать дальнейшей инструкции.

1) Проверяем чтобы gd или imagick на сервере были включены. Если нет — включаем.
2) Через composer (кстати, есть модуль в extrats) ставим либу rosell-dk/webp-convert. Если composer по каким-то причинам не работает, то ставим его отседова.
3) Создаем плагин WebP ставим галочку напротив события OnWebPagePrerender и вставляем в него нижеследующий код:
//<?php
	$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
	$notSupportDevice = array('iphone', 'ipod', 'ipad','macintosh','mac os','Edge','MSIE');
	
	foreach ($notSupportDevice as $val) {
		if(stripos($userAgent, $val) !== false) return;
	}	
	require $modx->config['base_path'].'vendor/autoload.php';
	use WebPConvert\WebPConvert;
	
	$content = $modx->Event->params['documentOutput'];     
	 //$content = &$modx->resource->_output; //Для Revolution раскомментируйте эту строку и первую.
	$imgs = array();
	preg_match_all('/<img[^>]+>/i',$content, $result); 
	if (count($result))
	{
		
		foreach($result[0] as $img_tag)
		{			
			preg_match('/(src)=("[^"]*")/i',$img_tag, $img[$img_tag]);						
			$img_real = str_replace('"','',$img[$img_tag][2]);
			$img_real = str_replace('./','',$img_real);			
	 	 	 if ((strpos($img_real, '.jpg')!==false) or (strpos($img_real, '.jpeg')!==false) or (strpos($img_real, '.png')!==false)) $imgs[] = $img_real; 					
		}
		$imgs = array_unique($imgs);
		foreach($imgs as $img_real)
		{
		if(($img_real) && (file_exists($modx->config['base_path'].$img_real)))
			{
				
				if (!file_exists($modx->config['base_path'].$img_real.'.webp'))
				{						
					$image = $modx->config['base_path'].$img_real;
					$destination =  $modx->config['base_path'].$img_real.'.webp';
					if (WebPConvert::convert($image, $destination)) $i = $img_real.'.webp'; 
					else $i = $img_real;
				}
				else $i = $img_real.'.webp';				
				$content = str_replace($img_real, $i, $content); 
			}
		}
	}
	
	$modx->Event->output($content);
	


4) Сохраняем. Радуемся. Все картинки на сайте у нас теперь в формате WebP. Получаем звонкие монеты от клиентов, не забываем делиться с автором. Хотя бы кармой) Если сработает — то позитивной, если нет — то гневной)

P.S. Для работы на Revolution замените соответствующую строку.