Skip to content

Instantly share code, notes, and snippets.

@egmalt
Created January 27, 2019 16:09
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save egmalt/6da5602efd953d3596ef3391adb10ba2 to your computer and use it in GitHub Desktop.
Save egmalt/6da5602efd953d3596ef3391adb10ba2 to your computer and use it in GitHub Desktop.
/**
* Генерирует webp копии изображений сразу после загрузки изображения в медиабиблиотеку
*
* - новые файлы сохраняет с именем name.ext.webp, например, thumb.jpg.webp
*/
function gt_webp_generation($metadata) {
$uploads = wp_upload_dir(); // получает папку для загрузки медиафайлов
$file = $uploads['basedir'] . '/' . $metadata['file']; // получает исходный файл
$ext = wp_check_filetype($file); // получает расширение файла
if ( $ext['type'] == 'image/jpeg' ) { // в зависимости от расширения обрабатаывает файлы разными функциями
$image = imagecreatefromjpeg($file); // создает изображение из jpg
} elseif ( $ext['type'] == 'image/png' ){
$image = imagecreatefrompng($file); // создает изображение из png
imagepalettetotruecolor($image); // восстанавливает цвета
imagealphablending($image, false); // выключает режим сопряжения цветов
imagesavealpha($image, true); // сохраняет прозрачность
}
imagewebp($image, $uploads['basedir'] . '/' . $metadata['file'] . '.webp', 90); // сохраняет файл в webp
foreach ($metadata['sizes'] as $size) { // перебирает все размеры файла и также сохраняет в webp
$file = $uploads['url'] . '/' . $size['file'];
$ext = $size['mime-type'];
if ( $ext == 'image/jpeg' ) {
$image = imagecreatefromjpeg($file);
} elseif ( $ext == 'image/png' ){
$image = imagecreatefrompng($file);
imagepalettetotruecolor($image);
imagealphablending($image, false);
imagesavealpha($image, true);
}
imagewebp($image, $uploads['basedir'] . $uploads['subdir'] . '/' . $size['file'] . '.webp', 90);
}
return $metadata;
}
add_filter('wp_generate_attachment_metadata', 'gt_webp_generation');
@zordig
Copy link

zordig commented Feb 16, 2019

А как сделать что бы в wordpress в медиафайлах отображались изображения с расширением WebP чтобы их можно было вставить с помощью виджета

@egmalt
Copy link
Author

egmalt commented May 4, 2019

Чтобы разрешить загрузку webp изображений в консоли можно добавить следующий код на фильтр upload_mimes:

/**
 * Разрешает использовать WEBP в медиаредакторе.
 */
function gt_add_webp($mimes) {
    $mimes['webp'] = 'image/webp';
    return $mimes;
}
add_filter('upload_mimes', 'gt_add_webp');

Но помните, что webp поддерживают не все браузеры, поэтому в коде такие изображения нужно оборачивать в тег picture и писать путь к альтернативному jpg или png изображению.

@IvanZhukouski
Copy link

Отличная штука! Еще бы добавить функцию удаления webp-копий файлов при удалении картинки из галереи.

@ypweb-git
Copy link

Интересное решение, но есть небольшая проблема с "перебирает все размеры файла и также сохраняет в webp" по факту генерируется только один файл webp, только оригинальное изображение. Есть ли возможность сгенерировать в webp остальные размеры? WP5.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment