Как реализовать конвертацию изображений в WebP на Opencart 2.x

WebP — это Формат изображений, который предложил Google в 2010 году. По началу этот тип изображений поддерживался очень небольшим количеством браузеров и поэтому вебмастера не сильно активно переходили на WebP.

Сейчас же ситуация в корне изменилась. Все современные сайты используют только WebP для картинок товаров, категорий и т.д. Это существенно увеличивает скорость загрузки сайта и повышает уровень доверия со стороны поисковых систем.

Внедрение формата WebP в CMS Opencart 2

CMS Opencart по умолчанию не поддерживает WebP, менеджер изображений просто не видит этот формат.

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

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

Открываем файл:

/index.php

Данный файл лежит в корне сайта.

Находим строку:

<?php

После неё добавляем:

if (strpos($_SERVER['REQUEST_URI'],'.webp') !== false) {
    $file = pathinfo($_SERVER['REQUEST_URI']);
    $file = __DIR__.$file['dirname'].$file['filename'];
    if (!file_exists($_SERVER['REQUEST_URI'])) {
        if (file_exists($file.'.gif')) {
            $iimage = imagecreatefromgif($file.'.gif');
        } elseif ($file.'.png') {
            $iimage = imagecreatefrompng($file.'.png');
        } elseif ($file.'.jpg') {
            $iimage = imagecreatefromjpeg($file.'.jpg');
        } elseif ($file.'.jpeg') {
            $iimage = imagecreatefromjpeg($file.'.jpeg');
        } 
		if(!$iimage){
			exit('Error: Could not load image ' . $file . '!');
		}
        imagewebp($iimage, __DIR__.$_SERVER['REQUEST_URI']);
        header('Content-type:image/webp');
        imagewebp($iimage);
        die();

    } else {
        exit('Error: Could not load image ' . $file . '!');
    }
}

Открываем файл:

/system/library/response.php

Находим строчки:

public function setOutput($output) {
		$this->output = $output;
	}

Заменяем весь этот блок на: 

public function setOutput($output) {
		if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
		    $output = preg_replace('/\b.jpg\b/u', '.webp', $output);
			$output = preg_replace('/\b.png\b/u', '.webp', $output);
			$output = preg_replace('/\b.jpeg\b/u', '.webp', $output);
		}
		$this->output = $output;
	}

Ищем файл:

/system/library/image.php

Находим строки:

if ($this->mime == 'image/gif') {
				$this->image = imagecreatefromgif($file);
			} elseif ($this->mime == 'image/png') {
				$this->image = imagecreatefrompng($file);
			} elseif ($this->mime == 'image/jpeg') {
				$this->image = imagecreatefromjpeg($file);
			}

Меняем их на:

if ($this->mime == 'image/gif') {
				$this->image = imagecreatefromgif($file);
			} elseif ($this->mime == 'image/png') {
				$this->image = imagecreatefrompng($file);
			} elseif ($this->mime == 'image/jpeg') {
				$this->image = imagecreatefromjpeg($file);
			} elseif ($this->mime == 'image/webp') {
				$this->image = imagecreatefromwebp($file);
			}
В этом же файле ищем строки:
if (is_resource($this->image)) {
			if ($extension == 'jpeg' || $extension == 'jpg') {
				imagejpeg($this->image, $file, $quality);
			} elseif ($extension == 'png') {
				imagepng($this->image, $file);
			} elseif ($extension == 'gif') {
				imagegif($this->image, $file);
			}

Меняем их на:

if (is_resource($this->image)) {
			if ($extension == 'jpeg' || $extension == 'jpg') {
				imagejpeg($this->image, $file, $quality);
			} elseif ($extension == 'png') {
				imagepng($this->image, $file);
			} elseif ($extension == 'gif') {
				imagegif($this->image, $file);
			} elseif ($extension == 'webp') {
				imagewebp($this->image, $file);
			}
После открываем файл:

/catalog/model/tool/image.php

Находим строки: 

$image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;

Перед ними добавляем: 

if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
            $extension = 'webp';
        }
Получаем конструкцию:
$image_old = $filename;
		if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
            $extension = 'webp';
        }
		$image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;

На версии php 5.4 нет поддержки webp. По этому убедитесь, что пользуетесь актуальной версией php перед тем, как внедрять данное решение на свой проект на CMS Opencart.

Подводим итог

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

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

Советую как можно быстрее переходить на современные форматы, особенно магазинам с большим количеством товаров. WebP заметно выигрывает перед другими форматами в размере (весе) и скорости загрузки. И не стоит забывать, что этот формат разработал Google и настоятельно рекомендует использовать на сайтах.

Чтоб не быть голословным, прикрепляю изображение с советом Pagespeed Insights по увеличению скорости сайта.

Вот что говорит сервис Гугла Pagespeed Insights:

Внедрить отображение WebP в Opencart 2


Автор статьи
Автор статьи: Роман Евтушенко
Разработчик
Пост опубликован: 07.12.2021
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Загрузка...

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *