Zapisujemy obrazki w WordPress jako WebP


Uwaga! Wszystkie informacje i solucje zawarte w postach typu DYI mogą z czasem przestać być aktualne. Niektóre publikowane kody źródłowe, będąc zależnymi od używanych konfiguracji platform i sprzętu, mogą nie działać, lub działać nieprawidłowo u niektórych użytkowników. Stosując opisane rozwiązania przyjmujesz do wiadomości i zgadzasz się, że nie ponoszę odpowiedzialności za ich finalne efekty.


WebP jest nowoczesnym formatem kompresji obrazów opracowanym przez Google. Został zaprezentowany po raz pierwszy w 2010 roku, zapewniając lepszą kompresję obrazów w porównaniu do tradycyjnych formatów, takich jak JPEG, PNG, czy GIF, przy zachowaniu wysokiej jakości obrazu. Zapisywanie w tym formacie nie jest dostępne natywnie w WordPress, ale jest na to sposób. Prosty, ale wymagający zainstalowania lub włączenia rozszerzenia GD na serwerze.

Rozszerzenie GD (Graphics Draw) to jedna z popularnych bibliotek graficznych używanych w PHP do manipulacji obrazami. Jest to potężne narzędzie, które umożliwia tworzenie, edytowanie i manipulowanie obrazami w różnych formatach. Jest ono zazwyczaj włączone domyślnie, ale jeśli wtyczka nie będzie działać, należy się upewnić, że problemem nie jest brak lub wyłączone GD.

Kod:

<?php
/*
Plugin Name: Automatic convert to WebP
Plugin URI: https://dariusz.staropietka.com
Description: Wtyczka konwertuje automatycznie dodawane obrazy do formatu WebP.
Version: 1.0
*/

// Dodajemy hook do funkcji, która będzie wywoływana po dodaniu nowego pliku do biblioteki mediów
add_filter('wp_handle_upload', 'convert_to_webp');

function convert_to_webp($upload) {
    $file_path = $upload['file'];

    // Sprawdzamy czy plik jest obrazem
    $file_type = wp_check_filetype($file_path);
    if (substr($file_type['type'], 0, 5) == 'image') {
        // Pobieramy rozszerzenie pliku
        $file_extension = pathinfo($file_path, PATHINFO_EXTENSION);

        // Sprawdzamy czy rozszerzenie jest wspierane
        if ($file_extension != 'webp') {
            // Konwertujemy obraz na format WebP
            $webp_file_path = str_replace('.' . $file_extension, '.webp', $file_path);
            $image = imagecreatefromstring(file_get_contents($file_path));
            if ($image && imagewebp($image, $webp_file_path)) {
                // Aktualizujemy dane załącznika w bazie danych
                $upload['file'] = str_replace('.' . $file_extension, '.webp', $upload['file']);
                $upload['url'] = str_replace('.' . $file_extension, '.webp', $upload['url']);
            }
        }
    }

    return $upload;
}
?>