DataFirefly Image Optimizer: documentatie Shopware 6
Installatie, configuratie van WebP en AVIF, CDN-integratie, Twig-API en probleemoplossing van de plugin Image Optimizer voor Shopware 6.6 en 6.7.
DataFirefly Image Optimizer zet elke Shopware-mediabestand automatisch om in WebP- en AVIF-varianten, hercomprimeert de originele JPEG- en PNG-bestanden en herschrijft de URL’s naar uw CDN, zonder wijzigingen aan het thema. Deze documentatie behandelt de installatie, de volledige configuratie, de Twig-API die aan thema’s wordt aangeboden en de probleemoplossing.
Installatie
De plugin wordt als ZIP geleverd. Er zijn twee installatiemethodes, functioneel gelijkwaardig.
Via de Shopware-administration
- Instellingen → Systeem → Extensies → Extensie uploaden
- Selecteer
DfImageOptimizer-1.0.0.zip - Klik op Installeren en daarna op Activeren
- Leeg de cache: Instellingen → Systeem → Cache en index → Legen
Via de CLI (aanbevolen)
cd /pad/naar/shopware
unzip DfImageOptimizer-1.0.0.zip -d custom/plugins/
sudo -u www-data setsid php bin/console plugin:refresh
sudo -u www-data setsid php bin/console plugin:install --activate DfImageOptimizer
sudo -u www-data setsid php bin/console cache:clear
sudo -u www-data setsid php bin/console theme:compile
theme:compile is na de installatie verplicht om de Twig-override van het thumbnailcomponent op de storefront actief te maken. Zonder die stap worden er geen <picture>-tags gegenereerd, ook al worden WebP en AVIF wel aangemaakt.Controle na de installatie
Ga naar het adminmenu Catalogi → Image Optimizer. Het dashboard moet verschijnen met een kaart Servercompatibiliteit die in realtime het volgende toont:
- Gedetecteerde PHP-versie (minimaal 8.2)
- Aanwezigheid van Imagick (aanbevolen)
- Aanwezigheid van GD (verplicht)
- Effectieve WebP-ondersteuning, moet ✓ zijn
- Effectieve AVIF-ondersteuning, kan ✗ zijn afhankelijk van de server, niet blokkerend
- Aanbevolen engine: Imagick of GD
Architectuur in het kort
Wanneer er een afbeelding wordt geüpload, luistert de plugin naar het entiteitsevent media.written, laadt de afbeelding in een lokaal tijdelijk bestand en produceert daarna parallel:
- Het hergecomprimeerde origineel (vervangt het oorspronkelijke bestand als Origineel comprimeren is aangevinkt)
- Een WebP-sibling ernaast met gestapelde extensie:
foo.jpg→foo.jpg.webp - Een AVIF-sibling ernaast:
foo.jpg→foo.jpg.avif
De Shopware-miniaturen die door de native ThumbnailService worden gegenereerd, worden op dezelfde manier verwerkt. Aan storefrontzijde wikkelt de Twig-override van storefront/component/image/thumbnail.html.twig de <img>-tag in een <picture> met bronnen voor AVIF en WebP en een terugval op het origineel; de browser kiest automatisch het lichtste formaat dat hij ondersteunt.
Configuratie
Toegang: Instellingen → Systeem → Extensies → DfImageOptimizer → Configureren. Zeven kaarten bundelen de opties.
Kaart “Algemeen”
| Optie | Standaard | Effect |
|---|---|---|
| Automatische optimalisatie bij upload | Ingeschakeld | Start de pijplijn direct bij elke upload. Schakel uit als u alles liever op de achtergrond via de cron laat verlopen. |
| Miniaturen verwerken | Ingeschakeld | Genereert WebP en AVIF ook voor de Shopware-miniaturen (doorgaans 4 tot 6 formaten per bronafbeelding). |
Kaart “WebP”
| Optie | Standaard | Aanbeveling |
|---|---|---|
| WebP activeren | Ingeschakeld | Laat dit aan staan, behalve in zeer specifieke gevallen. WebP wordt door 96 % van de browsers ondersteund. |
| WebP-kwaliteit (1-100) | 82 | 75 tot 85 voor een goed compromis. 90+ voor hoogwaardige fotografie, 70 voor een omvangrijke catalogus. |
| Lossless voor PNG | Uitgeschakeld | Activeer dit alleen als uw PNG’s tekst of scherpe graphics bevatten (logo’s, pictogrammen). Anders levert de lossy-modus meer winst op. |
Kaart “AVIF”
| Optie | Standaard | Aanbeveling |
|---|---|---|
| AVIF activeren | Uitgeschakeld | Activeer dit als het dashboard aangeeft dat uw server AVIF ondersteunt. Typische winst van 50 % ten opzichte van JPEG, maar het coderen is trager dan WebP. |
| AVIF-kwaliteit (1-100) | 55 | 45 tot 65 voor een uitstekende weergave. AVIF verdraagt lagere kwaliteitswaarden dan JPEG en WebP dankzij zijn moderne codec. |
| Maximale breedte voor AVIF (px) | 2400 | Beveiliging voor de CPU. Grotere afbeeldingen worden voor AVIF overgeslagen maar behouden hun WebP. Verhoog dit als u een krachtige server hebt en AVIF op grote afbeeldingen nodig hebt. |
IMG_AVIF gecompileerd, ofwel Imagick met libheif. Het dashboard Servercompatibiliteit laat precies zien wat beschikbaar is. Wordt AVIF niet ondersteund, dan blijft de optie zonder effect, ook aangevinkt: geen foutmelding, alleen geen AVIF-generatie.Kaart “Compressie”
| Optie | Standaard | Aanbeveling |
|---|---|---|
| Originele JPG/PNG comprimeren | Ingeschakeld | Vervangt het origineel door de hergecomprimeerde versie. Deze actie is onomkeerbaar: schakel uit als u de ruwe bronbestanden wilt bewaren voor latere bewerkingen. |
| JPEG-kwaliteit (1-100) | 85 | 85 is de standaard voor webfotografie. Ga naar 80 voor extra winst zolang de kwaliteit visueel aanvaardbaar blijft. |
| PNG-compressieniveau (0-9) | 7 | 9 = maximale compressie maar 3 tot 4 keer trager. 7 is het gebruikelijke evenwicht. |
| EXIF/ICC-metadata verwijderen | Ingeschakeld | Typische winst van 5 tot 30 kB per cameraopname. Behoud die als u met inhoud werkt die nauwkeurige kleurprofielen vereist. |
Kaart “CDN”
| Optie | Standaard | Uitleg |
|---|---|---|
| CDN-herschrijving activeren | Uitgeschakeld | Uitgeschakeld verwijzen de URL’s naar uw origin. Activeer dit nadat u uw CDN hebt ingesteld. |
| Basis-URL van het CDN | — | Formaat: https://cdn.voorbeeld.com zonder afsluitende schuine streep. Bijvoorbeeld https://shop-cdn.b-cdn.net voor BunnyCDN. |
| Bereik van de herschrijving | Alleen media | Zie de details hieronder. |
| Query strings behouden | Ingeschakeld | Behoudt de cache-bustingparameters (?v=1234) bij de herschrijving. |
Details van de drie bereiken:
- Alleen media: herschrijft uitsluitend de URL’s die met
/media/beginnen. Dit is het veiligst en dekt 95 % van de gangbare gevallen. - Media en miniaturen: voegt
/thumbnail/toe. Nuttig als uw storefront veel dynamisch gegenereerde miniaturen serveert. - Alle statische assets: voegt
/theme/,/bundles/en/assets/toe. Kies deze optie alleen als uw CDN correct is ingesteld om alle assets te pull-cachen en u dit in een stagingomgeving hebt getest.
Kaart “Weergave in de frontend”
| Optie | Standaard | Effect |
|---|---|---|
Uitvoer als <picture>-tag |
Ingeschakeld | Wikkelt de <img>-tags van de storefront in een <picture> met AVIF- en WebP-bronnen. |
loading="lazy" toevoegen |
Ingeschakeld | Native lazy loading van de browser. Laat dit aan staan, tenzij u een eigen oplossing hebt. |
decoding="async" toevoegen |
Ingeschakeld | Laat de browser decoderen terwijl de HTML wordt geparseerd. |
width/height forceren |
Ingeschakeld | Tegen CLS (Cumulative Layout Shift). De browser reserveert de ruimte voor het beeld voordat het is geladen. |
Kaart “Batchverwerking”
| Optie | Standaard | Aanbeveling |
|---|---|---|
| Batchgrootte voor de crontaak | 50 | 50 is een goed evenwicht. Ga naar 100 tot 200 als u een grote catalogus snel wilt inhalen en uw server dat aankan. |
| Croninterval (minuten) | 15 | Alleen ter informatie: het werkelijke interval wordt bepaald door de klasse OptimizeImagesTask::getDefaultInterval(). Om het echt te wijzigen past u de waarde in de tabel scheduled_task aan of installeert u de plugin na de wijziging opnieuw. |
Een CDN instellen, concrete voorbeelden
BunnyCDN (aanbevolen)
- Maak op bunny.net een Pull Zone aan met uw origin-URL, bijvoorbeeld
https://shop.voorbeeld.com - BunnyCDN geeft u een hostname van het type
shop-cdn.b-cdn.net - Vul in de configuratie van de plugin in:
https://shop-cdn.b-cdn.net - Kies om te beginnen het bereik Alleen media
- Activeer de CDN-herschrijving
De plugin voegt automatisch <link rel="dns-prefetch" href="https://shop-cdn.b-cdn.net"> en <link rel="preconnect" href="https://shop-cdn.b-cdn.net" crossorigin> toe in de head van de storefront, goed voor 50 tot 200 ms winst op de eerste CDN-aanvraag.
Cloudflare
Cloudflare in de standaard DNS-proxymodus vereist geen CDN-herschrijving, want Cloudflare cachet automatisch op uw hoofdhostname. Gebruikt u echter een eigen Custom Hostname van Cloudflare voor de assets (bijvoorbeeld cdn.voorbeeld.com), stel die dan hier in. Activeer aan de kant van Cloudflare ook Cache Reserve of Polish om bovenop uw eigen optimalisatie van die van Cloudflare te profiteren.
KeyCDN
De configuratie is identiek aan die van BunnyCDN: maak een Pull Zone aan, haal de URL van het type shop-12345.kxcdn.com op en stel die in de plugin in met het voorvoegsel https://.
AWS CloudFront
Maak een CloudFront-distributie aan met uw Shopware-server als origin. De distributie-URL is van het type https://d1234abc.cloudfront.net, of uw eigen domein als u een alias hebt ingesteld. Stel de minimale TTL in op 1 dag om de cache volledig te benutten.
De optimalisatiepijplijn in detail
Voor elke te verwerken afbeelding (origineel of miniatuur) voert de plugin de volgende stappen in deze volgorde uit:
- Downloaden van de bronafbeelding van het publieke Shopware-filesystem naar een lokaal tijdelijk bestand (
/tmp/dfimgopt_xxx.jpg) - Als Origineel comprimeren actief is: hercompressie ter plaatse met de ingestelde kwaliteit en verwijdering van de metadata indien geactiveerd. Is de hergecomprimeerde versie kleiner dan het origineel, dan vervangt ze het oorspronkelijke bestand op het filesystem.
- Als WebP actief is: conversie naar WebP en wegschrijven van de sibling
foo.jpg.webpop het publieke filesystem - Als AVIF actief is en de breedte ≤ de maximale breedte: conversie naar AVIF en wegschrijven van de sibling
foo.jpg.avif - Registratie in de tabel
df_image_optimizermet tellers en de bespaarde omvang - Opruimen van het lokale tijdelijke bestand via een
finally-blok (ook bij een fout)
Imagick krijgt voorrang wanneer die beschikbaar is (betere kwaliteit en op veel servers de enige AVIF-engine via libheif). Anders neemt GD het over; die ondersteunt WebP al lang en AVIF sinds PHP 8.1.
Geplande taak, bestaande afbeeldingen inhalen
De plugin activeren op een shop met al duizenden afbeeldingen in de database start geen optimalisatie met terugwerkende kracht. Dat is bewust: 50.000 afbeeldingen in één keer naar AVIF omzetten zou uw server verzadigen. In plaats daarvan draait de geplande taak df_image_optimizer.optimize_pending standaard elke 15 minuten:
- SQL-query via LEFT JOIN op
df_image_optimizerom de nog niet geoptimaliseerde media te vinden - Verwerking van een batch van 50 afbeeldingen (batchgrootte instelbaar)
- Afronden en de worker vrijgeven voor de volgende taak
Op een shop met 10.000 afbeeldingen duurt het ongeveer 50 uur om alles op de achtergrond in te halen. Om te versnellen:
- Verhoog de batchgrootte in de configuratie (probeer 100 of 200)
- Gebruik de knop Batch starten in het dashboard meerdere keren achter elkaar
- Voer de taak handmatig in een lus uit via de CLI:
for i in {1..100}; do sudo -u www-data setsid php bin/console scheduled-task:run-single df_image_optimizer.optimize_pending; done
Twig-API voor thema’s
Er worden twee Twig-helpers geregistreerd die u in elk thema- of plugintemplate kunt gebruiken.
Filter |df_cdn
Herschrijft een URL naar het CDN indien geactiveerd, en geeft anders de URL ongewijzigd terug. Nuttig voor assets die u handmatig invoegt.
<img src="{{ media.url|df_cdn }}" alt="...">
<link rel="preload" as="image" href="{{ heroImage.url|df_cdn }}">
<style>
.hero { background-image: url("{{ bgImage.url|df_cdn }}"); }
</style>
Functie df_picture()
Rendert een volledige <picture>-tag met AVIF- en WebP-bronnen en een terugval op het origineel, plus alle ingestelde attributen (lazy, async, width/height).
{{ df_picture(
media,
alt='Toegankelijke beschrijving',
classes='product-image card-img',
sizes='(max-width: 768px) 100vw, 50vw'
) }}
Genereert:
<picture>
<source type="image/avif"
srcset="https://cdn.voorbeeld.com/media/foo.jpg.avif"
sizes="(max-width: 768px) 100vw, 50vw">
<source type="image/webp"
srcset="https://cdn.voorbeeld.com/media/foo.jpg.webp"
sizes="(max-width: 768px) 100vw, 50vw">
<img src="https://cdn.voorbeeld.com/media/foo.jpg"
alt="Toegankelijke beschrijving"
class="product-image card-img"
sizes="(max-width: 768px) 100vw, 50vw"
loading="lazy"
decoding="async"
width="1200"
height="800">
</picture>
Admin API-endpoints
Er zijn drie REST-endpoints beschikbaar, geauthenticeerd via het standaard Bearer-token van de admin.
| Methode | Route | Beschrijving |
|---|---|---|
| GET | /api/_action/df-image-optimizer/stats |
Overzicht, activiteit van 30 dagen en servercapaciteiten |
| POST | /api/_action/df-image-optimizer/run-batch |
Start een batch. Optionele POST-parameter batchSize (standaard 50, maximaal 500) |
| GET | /api/_action/df-image-optimizer/capabilities |
Serverdetectie (Imagick / GD / WebP / AVIF) |
Voorbeeld met curl:
TOKEN=$(curl -s -X POST https://shop.voorbeeld.com/api/oauth/token
-H "Content-Type: application/json"
-d '{"grant_type":"password","client_id":"administration","scope":"write","username":"admin","password":"shopware"}'
| jq -r .access_token)
curl -X POST https://shop.voorbeeld.com/api/_action/df-image-optimizer/run-batch
-H "Authorization: Bearer $TOKEN"
-H "Content-Type: application/json"
-d '{"batchSize":200}'
Aangemaakte tabellen
df_image_optimizer
Eén regel per geoptimaliseerd mediabestand. Unieke sleutel op media_id: een nieuwe optimalisatie van hetzelfde bestand overschrijft de regel.
id BINARY(16) UUID
media_id BINARY(16) FK media.id ON DELETE CASCADE, UNIQUE
has_webp TINYINT(1)
has_avif TINYINT(1)
compressed TINYINT(1)
original_size BIGINT Oorspronkelijke omvang in bytes
bytes_saved BIGINT Totale besparing (compressie plus delta WebP/AVIF)
sales_channel_id BINARY(16) FK sales_channel.id ON DELETE SET NULL
optimized_at DATETIME(3)
created_at DATETIME(3)
df_image_optimizer_log
Optioneel foutenlogboek. Alleen-lezen voor debugging, zonder automatische opschoning.
Probleemoplossing
“Het dashboard toont AVIF: niet beschikbaar”
Uw server beschikt niet over de vereiste AVIF-stack. Opties:
- Als u alleen GD hebt: controleer
php -m | grep gdenphp -i | grep AVIF. U hebt PHP 8.1+ en GD gecompileerd met--with-avifnodig. Op recente Debian- en Ubuntu-versies is dat standaard. - Als Imagick beschikbaar is: controleer
php -r "print_r(Imagick::queryFormats('AVIF'));". Leeg? Dan is uw Imagick niet met libheif gecompileerd: opnieuw compileren of overschakelen op GD. - Aanvaardbare terugval: laat AVIF uitgeschakeld en concentreer u op WebP. De winst van WebP alleen is al enorm ten opzichte van de native JPEG van Shopware.
“De .webp-bestanden worden wel gegenereerd maar de storefront toont JPEG”
De themacompiler heeft de Twig-override niet meegenomen. Oplossing:
sudo -u www-data setsid php bin/console theme:compile
sudo -u www-data setsid php bin/console cache:clear
Controleer daarna met de DevTools van de browser (Chrome of Firefox): open het tabblad Netwerk, herlaad een productpagina en bekijk het MIME-type van de geladen afbeeldingen. U zou image/avif of image/webp moeten zien in plaats van image/jpeg.
“Het uploaden van media is traag geworden”
Vooral de AVIF-conversie is CPU-intensief: reken op 1 tot 3 seconden per afbeelding. Is dat hinderlijk, schakel dan de automatische optimalisatie bij upload uit (kaart Algemeen) en laat alleen de geplande taak op de achtergrond werken. De uploads worden dan weer direct en de afbeeldingen zijn binnen maximaal 15 minuten geoptimaliseerd.
“De .webp-miniaturen worden niet gegenereerd”
Controleer of Miniaturen verwerken is aangevinkt op de kaart Algemeen. Genereer daarna de miniaturen handmatig opnieuw zodat ze de pijplijn opnieuw doorlopen:
sudo -u www-data setsid php bin/console media:generate-thumbnails
“Hoe verwijder ik alle gegenereerde WebP- en AVIF-bestanden?”
De plugin verwijdert ze niet automatisch, ook niet bij het verwijderen van de plugin (om uw back-ups te sparen). Om ze handmatig op te ruimen:
cd /pad/naar/shopware
find public/media -name "*.webp" -delete
find public/media -name "*.avif" -delete
“De CDN-URL’s worden niet overal toegepast”
Controleer het ingestelde bereik. Ziet u origin-URL’s voor thema-assets (/theme/.../style.css), dan is dat normaal bij het standaardbereik Alleen media. Ga naar Alle statische assets als uw CDN is ingesteld om alle assets te serveren.
Let er ook op dat de herschreven URL’s de Twig-weergave aan serverzijde betreffen. Roept uw frontend de Store API aan en bouwt hij de URL’s aan JavaScript-zijde opnieuw op, dan moet u de herschrijving aan de clientzijde apart toepassen.
Verwijderen
sudo -u www-data setsid php bin/console plugin:uninstall DfImageOptimizer
sudo -u www-data setsid php bin/console plugin:remove DfImageOptimizer
Bij het verwijderen vraagt Shopware of u de gebruikersgegevens wilt behouden:
- Behouden (standaard): de tabellen
df_image_optimizerendf_image_optimizer_logblijven in de database staan. Bij een herinstallatie wordt de geschiedenis hervat. - Niet behouden: de twee tabellen worden verwijderd (DROP TABLE).
In beide gevallen blijven de bestanden .webp en .avif op het filesystem staan; gebruik de bovenstaande find-commando’s om ze zo nodig op te ruimen.
Verder gaan
- Volg uw Core Web Vitals-score in Google Search Console: de LCP hoort binnen 2 tot 4 weken na de activering te dalen
- Test met PageSpeed Insights vóór en na: typische winst van 20 tot 40 punten op mobiel
- Activeer aan serverzijde ook HTTP/2 of HTTP/3 om het voordeel van het CDN te vergroten
- Combineer dit met een full page cache van Shopware voor statische responstijden