Далеко не все браузеры принимают формат изображений WEBP. В этой статье мы напишем код, который будет  проверять принимает ли браузер формат WEBP, а затем создаст новую папку кэша изображений и преобразует уже существующие изображения в формат webp.

Начнём с этого файла: catalog/model/tool/image.php, добавляем:

$image_new_webp = 'cachewebp/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.webp';

Добавляем код, после этой строчки:

$image_new = 'cache/'

Для того чтобы проверить, принимает ли браузер изображения в формате webp а затем создать свой новый кэш изображений, добавляем в том же файле:

$gd = gd_info();

        if ($gd['WebP Support']) {

            if (!is_file(DIR_IMAGE . $image_new_webp) || (filectime(DIR_IMAGE . $image_new) > filectime(DIR_IMAGE . $image_new_webp))) {

                $path = '';

                $directories = explode('/', dirname($image_new_webp));

                foreach ($directories as $directory) {

                    $path = $path . '/' . $directory;

                    if (!is_dir(DIR_IMAGE . $path)) {

                        @mkdir(DIR_IMAGE . $path, 0777);

                    }

                }

                $image_webp = new Image(DIR_IMAGE . $image_old);

                $image_webp->resize($width, $height);

                $image_webp->save_webp(DIR_IMAGE . $image_new_webp);

            }

        }

Добавляем код, перед этой строчки:

public function save($file, $quality = 90) {

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

Заходим в файл system/library/image.php и пишем функцию:

public function save_webp($file, $quality = 90) {

            if (is_resource($this->image)) {

                imagewebp($this->image, $file, $quality);

                imagedestroy($this->image);

            }

        }

Добавляем перед строкой:

public function save($file, $quality = 90) {

Выводим изображения в формате webp добавив функцию в файл - system/library/response.php

public function webpRebuild($output) {

            $gd = gd_info();

            if ($gd['WebP Support']) {

                $uri = '';

                if (isset($_SERVER['REQUEST_URI'])) {

                    $uri = $_SERVER['REQUEST_URI'];

                }

                

                if (stripos($uri, 'admin') === false) { // admin is your dashboard url if you have different name jst change it

                    if (isset($_SERVER['HTTP_ACCEPT']) && isset($_SERVER['HTTP_USER_AGENT'])) {

                        if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {   

                            $re = '/(cache)(.*)(\.jpg|\.png|.jpeg)/U';

                            $subst = '$1webp$2.webp';

                            $this->output = preg_replace($re, $subst, $this->output);

                        }

                    }

                }

            }

        }

Добавляем перед строчкой:

<p "p1 text-code">private function compress($data, $level = 0)

В том же файле вы должны вывести функцию webpRebuild поэтому добавьте этот код:

$this->webpRebuild($this->output);

Добавляем после линии:

$output = $this

Рубрики: