=== SK Image Performance ===
Contributors: spixels
Tags: performance, lcp, core-web-vitals, fetchpriority, preload, woocommerce
Requires at least: 6.3
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.6.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Responsive preload van de belangrijkste afbeelding met fetchpriority=high, plus optionele fixes voor de Kadence-productgalerij en GenerateBlocks.

== Description ==

SK Image Performance verbetert je Largest Contentful Paint (LCP) score zonder dat je per afbeelding instellingen hoeft te wijzigen.

De plugin pakt de uitgelichte afbeelding (featured image) van elke pagina, post en product, en plaatst een preload-tag met `fetchpriority="high"` in de `<head>`. Browsers halen die afbeelding dan direct op, zonder eerst CSS te hoeven parsen.

Die preload is **responsive**: hij geeft dezelfde formaten mee (`imagesrcset` en `imagesizes`) als de afbeelding in de pagina zelf, zodat een telefoon een kleiner bestand krijgt en er nooit onnodig een groot origineel wordt gedownload.

= Hoe gebruik je het =

1. Installeer en activeer de plugin.
2. Zorg dat elke belangrijke pagina, post of product een **uitgelichte afbeelding** (featured image) heeft.
3. Klaar. Geen instellingen, geen velden, geen URL invullen.

= Wat doet de plugin precies =

* Singular pages (post / page / product, ook custom post types): responsive preload van de featured image met fetchpriority=high.
* Categorie / archief / shop / cart / checkout / 404: geen actie (meerdere kandidaten of geen LCP).
* Productpagina's met de Kadence-productgalerij: geen aparte preload, want de galerij-feature regelt de prioriteit daar al. Twee keer doen levert een dubbele download op en dus een slechtere LCP.

= Optionele snelheidsfeatures =

Onder Sven Kersten -> Image Performance -> Instellingen staan drie extra features. Alle drie staan standaard aan en doen niets op sites waar ze niet van toepassing zijn.

* **Responsive preload.** Preload met imagesrcset/imagesizes in plaats van één vaste URL. Uitzetten kan, dan valt de plugin terug op het formaat "large".
* **Kadence-productgalerij versnellen.** De eerste slide van de Kadence Shop Kit galerij krijgt `fetchpriority="high"` en wordt meteen zichtbaar gemaakt, zodat de browser niet op de slider-JavaScript hoeft te wachten. Doet niets zonder die galerij.
* **GenerateBlocks-afbeeldingen aanvullen.** Media-blokken die alleen een vaste `src` meekrijgen, krijgen alsnog srcset en sizes. De URL-naar-afbeelding lookup wordt persistent gecachet, zodat dit geen extra databasequery per afbeelding per bezoek kost.

Daarnaast twee instelbare waarden:

* **Grootste formaat in srcset** (standaard 1600px). Voorkomt dat een origineel van 2560px als kandidaat meegaat.
* **Eigen sizes-attribuut.** Leeg laten betekent: gebruik wat WordPress zelf zou genereren. Voor een hero over de volle breedte is `(max-width: 768px) 768px, 100vw` een goede waarde.

= Per-pagina overrides, ook voor je hero =

In de pagina-, post- of product-editor verschijnt een paneel "Image Performance" (Gutenberg sidebar of klassieke meta-box, afhankelijk van welke editor actief is). Daarmee kun je per pagina:

* De preload helemaal uitschakelen voor die pagina
* Een aangepaste afbeelding selecteren die in plaats van de uitgelichte afbeelding gepreload wordt

Dat tweede is bewust de manier om een hero-afbeelding aan te wijzen die geen featured image is, bijvoorbeeld een achtergrond uit een page-builder of uit een themaveld. Zo hoef je geen themacode of ACF-veld te koppelen: het werkt op elke site, en de redacteur ziet in de editor welke afbeelding er voorrang krijgt.

= Compatibel met =

* Perfmatters (werkt samen, geen conflicten)
* WooCommerce 7.0+
* Alle thema's met featured image support

= Voor ontwikkelaars =

`sk_ip_preload_url` past de URL aan vlak voordat de tag geprint wordt. Geef je een andere URL terug, dan laat de plugin de srcset vallen, want die hoort dan niet meer bij die bron:

`add_filter( 'sk_ip_preload_url', function ( $url, $post_id, $attachment_id ) {`
`    return is_front_page() ? get_stylesheet_directory_uri() . '/assets/hero.jpg' : $url;`
`}, 10, 3 );`

`sk_ip_should_preload` blokkeert de preload voor een pagina: `apply_filters( 'sk_ip_should_preload', true, $post_id, $attachment_id )`.

`sk_ip_image_source` past de complete bron aan (`src`, `srcset`, `sizes`, `width`), voor zowel de preload als de aangevulde GenerateBlocks-afbeeldingen.

`sk_ip_kadence_gallery_active` overrulet de detectie van de Kadence-productgalerij, bijvoorbeeld als je die per product uitzet.

Elke optie heeft een gelijknamige filter: `sk_ip_responsive_preload`, `sk_ip_srcset_max_width`, `sk_ip_sizes_attr`, `sk_ip_kadence_gallery`, `sk_ip_gb_srcset`, `sk_ip_preload_on_kadence_products`.

== Installation ==

1. Upload de plugin naar `/wp-content/plugins/`
2. Activeer via Plugins → Geinstalleerde plugins
3. Status onder Instellingen → SK Image Performance

== Changelog ==

= 1.6.2 =
* Security: updates are only installed when they carry a valid signature from the publisher. A tampered or unsigned update is refused and nothing is installed.
* Beheer: gedeelde beheeromgeving 2.1.0 (knoppen, contrast, opslagbalk en smalle schermen).
* Getest op WordPress 7.1.

= 1.6.1 =
* Updates komen voortaan automatisch binnen via de SK-updateserver. Deze versie moet nog één keer met de hand worden geïnstalleerd.
* Onderhoud: de gedeelde SK-onderdelen (menu, licenties, AI-sleutels en updater) voldoen nu aan de eisen van het WordPress Plugin Review Team. Er verandert niets aan de werking; bestaande instellingen, licenties en sleutels blijven gewoon werken.

= 1.6.0 =
* Nieuw: de preload is responsive. Hij geeft `imagesrcset` en `imagesizes` mee met dezelfde formaten als de afbeelding in de pagina, in plaats van één vaste URL. Instelbaar via "Grootste formaat in srcset" (standaard 1600px) en een eigen sizes-attribuut.
* Nieuw: optionele feature voor de Kadence-productgalerij. De eerste slide krijgt `fetchpriority="high"` en wordt meteen zichtbaar, zodat de browser niet op de slider-JavaScript wacht. Doet niets op sites zonder die galerij.
* Nieuw: optionele feature die GenerateBlocks media-blokken zonder srcset alsnog srcset en sizes geeft. De URL-naar-afbeelding lookup wordt persistent gecachet en bij wijzigingen in de mediabibliotheek automatisch ververst.
* Nieuw: dedup-guard. Op productpagina's waar de Kadence-galerij de prioriteit al regelt, wordt er geen aparte preload meer uitgestuurd. Meting op een winkel met die galerij: een tweede preload van hetzelfde beeld kostte 1,9s extra render delay en bracht de PageSpeed-score van 86 naar 70. Vanaf WordPress 6.6 loopt de preload bovendien via de WordPress-API, zodat dubbele preloads van andere plugins ook worden herkend.
* Nieuw: instellingen-tab met schakelaars voor alle drie de features, met verstandige standaardwaarden.
* Vervangt de custom LCP-snippets die per site werden onderhouden. De hero-afbeelding wijs je nu aan via het paneel "Image Performance" op de pagina zelf, dus zonder themacode of ACF-veld.

= 1.5.0 =
* Nieuw: auto-cap voor nieuwe uploads. Verlaagt de WordPress "big image"-drempel (`big_image_size_threshold`) naar een instelbare maximale breedte, zodat onnodig grote uploads automatisch kleiner worden zonder kwaliteitsverlies. Opt-in via de optie `sk_ip_max_upload_width` (px; 0 = uit/geen wijziging), override via filter `sk_ip_max_upload_width`. Standaard uit, dus geen gedragsverandering tot ingesteld.

= 1.2.8 =
* Security: SSRF-protection in diagnose. Alleen URLs op dezelfde host als de site worden gefetcht (voorkomt fetch naar localhost / cloud metadata / interne netwerk).
* Robust: `get_queried_object_id()` ipv `get_the_ID()` in wp_head context.
* Fix: race condition in selector — snel klikken tussen tabs kan stale resultaten renderen. Snapshot context vóór await, ignore stale responses.

= 1.2.7 =
* Fix: hidden URL inputs werden niet aangemaakt (DOM-zoekpad was binnen .sk-ip-selector terwijl de hidden-urls div buiten staat). Daardoor stuurde Analyseren geen diagnose_url[] mee. Nu correct via form-context.

= 1.2.6 =
* Fix: dubbele border tussen pinned section en alfabetische lijst (divider verwijderd, item border-bottom volstaat).

= 1.2.5 =
* Pinned items: homepage altijd bovenaan in de selector (bij Alles + Pagina's tab, geen zoekquery actief).
* Filter `sk_ip_pinned_items` voor cross-customer extensions (bv. shop page, contact page).
* Homepage uit alfabetische lijst gefilterd om duplicaten te voorkomen.

= 1.2.4 =
* Fix: search input toonde nog WP-admin default border binnen de flex-wrapper (overrule via !important).
* Fix: border-radius gaat niet meer verloren bij hover op de "Geavanceerd" container (overflow: hidden).

= 1.2.3 =
* Search-bar overgeschakeld naar flex-layout (icon + input naast elkaar binnen wrapper). Robuuster, geen absolute-positioning meer.

= 1.2.2 =
* Multi-select: meerdere pagina's tegelijk selecteren en analyseren. Counter "X geselecteerd" + "wis selectie" link.
* Search-icon vaste 40px wrapper-positionering (geen overlap meer met placeholder).
* Diagnose-output: per geselecteerde URL een eigen rapport-blok met URL als kop.

= 1.2.1 =
* UI: styling 1-op-1 geport uit sk-schema-manager-pro (paarse accent #7c3aed, search-icon SVG, radio-circle pattern, infinite scroll).
* Search-icon overlapt niet meer met placeholder.
* Lijst gebruikt eigen scroll (max-height 384px) ipv pagina-scroll.

= 1.2.0 =
* Diagnose-UI in stijl van SK Schema Manager: type-tabs (Alles + per type), zoekveld, lijst met item-cards.
* Lijst is altijd zichtbaar (laadt direct bij open van de pagina), klant ziet meteen wat beschikbaar is.
* Klikken op item selecteert; "Geselecteerd"-indicator toont titel + URL.
* "Meer laden" knop voor pagination per type.

= 1.1.0 =
* Diagnose-tool: live-search combo-box voor pagina's, posts, producten en categorieën via WP REST API.
* Standaard ingeschakelde types: page, post, product, product_cat — uitbreidbaar via Geavanceerd-instellingen.
* Plak-een-URL shortcut: typ direct https://... om zoeken over te slaan.
* Toetsenbord-navigatie (↑/↓/Enter) in dropdown.

= 1.0.5 =
* Plugin geïntegreerd in SK Suite menu (Sven Kersten → Image Performance), inclusief gedeelde "Over" en "AI API Sleutels" submenu's.

= 1.0.4 =
* Volledige rewrite. Alleen preload-tag generatie voor featured images.
* Geen output buffer, geen img-tag manipulatie, geen settings.
* Werkt voor singular pages (post, page, product, CPT).

= 1.0.0 - 1.0.3 =
* Niet-uitgebrachte versies (intern testen).
