=== Skeo Connector ===
Contributors: svenkersten
Donate link: https://skeo.nl
Tags: seo, content publishing, ai content, yoast, rank math
Requires at least: 6.3
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.10.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Verbind je WordPress met Skeo en publiceer SEO-geoptimaliseerde artikelen direct vanuit Skeo naar je site.

== Description ==

**Skeo Connector** is de officiële WordPress-plugin van [Skeo](https://skeo.nl), het SEO-platform door Sven Kersten. Met deze plugin verbind je je WordPress-site veilig met je Skeo-project en publiceer je SEO-geoptimaliseerde artikelen rechtstreeks vanuit Skeo naar je site.

= Wat doet de plugin =

* **Eén-klik publish** vanuit Skeo's article-creator naar WordPress
* **SEO-meta automatisch ingevuld** — werkt out-of-the-box met Yoast SEO, Rank Math en All in One SEO (AIOSEO)
* **Featured image** automatisch ingesteld vanuit Skeo's image-library
* **Media-upload** naar je WordPress media library, met deduplicatie zodat re-publishes geen dubbele bestanden aanmaken
* **Native Gutenberg-blocks** per element: headings, lijsten, paragrafen en afbeeldingen komen als losse bewerkbare blokken in de Block Editor
* **Categorieën en tags** worden gekoppeld of automatisch aangemaakt
* **Excerpt** en SEO-meta-titel/-beschrijving in de juiste velden geplaatst
* **Veilige authenticatie** via een one-time-code handshake; tokens worden SHA-256-gehasht en met je WordPress salt versleuteld opgeslagen

= Voor wie =

Voor SEO-ondernemers en agencies die Skeo gebruiken om content te plannen en optimaliseren, en die hun artikelen direct naar één of meerdere WordPress-sites willen kunnen publiceren zonder copy-paste-werk. Skeo Connector valt onder het [Sven Kersten plugins ecosystem](https://spixels.nl) en deelt zijn admin-menu met andere SK plugins zoals SK Image Performance en SK Schema Manager.

= Vereisten =

* WordPress 6.3 of hoger
* PHP 7.4 of hoger
* Een actief [Skeo-abonnement](https://skeo.nl)
* HTTPS op je WordPress-site (de plugin weigert verbindingen over plain HTTP)

== Installation ==

1. Installeer de plugin via WordPress-admin > Plugins > Nieuwe toevoegen, of upload de ZIP via Plugins > Plugin uploaden.
2. Activeer de plugin.
3. Ga naar **Sven Kersten > Skeo** in het WordPress-admin menu.
4. Open je [Skeo-account](https://app.skeo.nl), kies je project, ga naar **Instellingen > Integraties > WordPress** en klik op "Koppelen".
5. Kopieer de verbindingscode die Skeo toont.
6. Plak de code in de plugin-pagina en klik op "Verbinden".
7. Klaar. Vanaf nu kun je vanuit Skeo's article-creator op "Publiceer naar WP" klikken en artikelen rechtstreeks naar je site sturen.

== Frequently Asked Questions ==

= Kost de plugin geld? =

De plugin zelf is gratis. Je hebt een actief Skeo-abonnement nodig om hem te gebruiken. Bekijk de abonnementen op [skeo.nl](https://skeo.nl).

= Welke SEO-plugins worden ondersteund? =

Yoast SEO, Rank Math en All in One SEO (AIOSEO) worden automatisch herkend. Meta-titel, meta-beschrijving en focus-keyword worden naar het juiste plugin-veld geschreven. Werk je zonder SEO-plugin? Dan slaat Skeo Connector de meta-data op in `_skeo_*` post-meta voor toekomstig gebruik.

= Werkt het met page-builders? =

Classic Editor en Gutenberg (Block Editor) worden volledig ondersteund met native blocks. Voor Divi, Elementor en Beaver Builder publiceren we content als HTML in `post_content`. De content rendert correct, maar wordt niet automatisch als losse page-builder-modules opgeknipt. Native page-builder-output staat op de roadmap.

= Hoe veilig is de verbinding? =

De initiële koppeling gebruikt een HMAC-SHA256-getekende one-time-code met een TTL van 10 minuten. Het API-token wordt op WordPress-zijde alleen als SHA-256-hash opgeslagen voor incoming verificatie, plus AES-256-CBC-versleuteld (key afgeleid van je WordPress salt) voor outgoing calls. Skeo bewaart het token AES-256-GCM-versleuteld in een dedicated key-namespace. Alle externe HTTP-calls gebruiken expliciete TLS-verificatie en weigeren downgrades naar HTTP.

= Wat gebeurt er als ik de plugin uninstalleer? =

Lokale plugin-instellingen worden verwijderd. Bestaande gepubliceerde posts en hun WordPress-meta blijven staan. Bij re-install kun je opnieuw verbinden zonder je content te verliezen. Skeo wordt automatisch op de hoogte gesteld dat de verbinding verbroken is.

= Kan ik via Skeo direct meerdere WordPress-sites bedienen? =

Ja. Per Skeo-project koppel je één WordPress-site. Beheer je meerdere klanten in Skeo? Dan installeer je de plugin op elke site afzonderlijk en koppel je elke installatie aan het bijbehorende Skeo-project.

= Worden afbeeldingen op mijn server opgeslagen? =

Ja. Tijdens publish uploadt de plugin alle afbeeldingen (featured + inline) naar je WordPress media library. De URLs in de content worden automatisch herschreven naar lokale URLs. Bij re-publish van dezelfde afbeelding wordt het bestaande media-attachment hergebruikt via een hash-check; geen duplicates.

== Screenshots ==

1. Plugin-pagina onder het "Sven Kersten" menu in WordPress-admin met dual-branding (Skeo + SK logo).
2. Connect-flow: plak de one-time-code uit Skeo en klik op "Verbinden".
3. Verbonden status: SEO-plugin en page-builders worden automatisch gedetecteerd.
4. Publiceer-modal in Skeo met live WordPress-categorieën, -tags en -auteurs.
5. Resultaat in WordPress: native Gutenberg-blocks per element, featured image ingesteld, Yoast-meta gevuld.

== Changelog ==

= 1.10.1 =
* Categorieën komen in de juiste indeling: kies je in Skeo een categorie voor bijvoorbeeld een recept, dan komt die in de receptcategorieën en niet bij de blogcategorieën.
* Een berichttype zonder categorieën of tags krijgt er bij publiceren ook geen meer bij.

= 1.10.0 =
* Recepten: Skeo zet een recept van WP Recipe Maker in je artikel, op de plek die je kiest. Een bestaand conceptbericht met dat recept wordt overgenomen in plaats van verdubbeld.
* Recepten: op de instellingenpagina kies je namens welke gebruiker WP Recipe Maker het recept aan het bericht koppelt.
* Werkt nu ook op sites met WP Force Login: Skeo kan de site weer bereiken, de rest van de site blijft afgeschermd.
* Lijsten in Skeo tonen het juiste soort berichten, ook als je thema zoekresultaten tot producten beperkt.
* Een automatische inhoudsopgave (zoals Easy Table of Contents) komt niet meer als vaste tekst in je herschreven pagina.
* Getest op WordPress 7.1.

= 1.9.7 =
* 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.9.6 =
* 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.9.5 =
* De antwoorden van de plugin blijven uit de page cache van de server. Op sites met paginacache kon een antwoord blijven hangen, waardoor Skeo een verouderd beeld van de site kreeg en de gegevens zonder token op te vragen waren.

= 1.9.4 =
* De site meldt aan Skeo of ze de pillar van een artikel in het kruimelpad kan tonen. Zo belooft het publiceerscherm alleen een kruimel op sites die hem ook echt zetten.

= 1.9.3 =
* Bij het publiceren wordt vastgelegd bij welke pillar een artikel hoort, zodat het kruimelpad op de site dat kan tonen. Hoort het artikel nergens meer bij, dan verdwijnt die vermelding weer.

= 1.9.2 =
* Een samengevatte regel wordt als zodanig gemeld, in plaats van dat je dat aan het adres moet zien.

= 1.9.1 =
* Samengevatte regels worden verstuurd in de vorm waarin ze aan de andere kant bewaard worden, zodat terugzoeken op die waarde werkt.

= 1.9.0 =
* Crawlerbezoeken worden gerichter bijgehouden. Technische adressen zoals admin-ajax, sitemaps en losse bestanden tellen niet meer mee, want daar staat geen inhoud achter. Bezoeken aan echte pagina's blijven per adres zichtbaar, zodat je ziet welke artikelen en producten worden opgehaald. Filter- en doorbladerpagina's worden samengevat tot een regel per dag per crawler.

= 1.8.4 =
* De melding of er een CDN voor de site staat berust nu op twee waarnemingen van buitenaf in plaats van op een opzoeking vanaf de server zelf. Daardoor kan de plugin op de meeste sites een echt antwoord geven waar eerder alleen "onbekend" mogelijk was.

= 1.8.3 =
* Verandert het oordeel over een CDN voor de site, dan wordt dat meteen doorgegeven. Een eerder verstuurd oordeel bleef anders staan tot er toevallig weer crawlerverkeer langskwam.

= 1.8.2 =
* De melding of er een CDN voor de site staat kon ten onrechte "ja" zeggen. Een webserver wijst zijn eigen domein doorgaans naar zichzelf, en dat antwoord werd vergeleken met het adres waarop de site van buitenaf bereikbaar is. Bij twijfel doet de plugin nu geen uitspraak.

= 1.8.1 =
* Een site die niet aan Skeo gekoppeld is verzamelt geen crawlergegevens meer. Er was geen bestemming voor die cijfers, terwijl er wel elk uur een ronde draaide en een tabel volliep.

= 1.8.0 =
* Crawlerbezoeken worden nu ook geteld op hosting waar geen access-log te lezen is. Daar telt de plugin wat PHP bereikt; de dekkingsmeter zegt erbij welk deel van het verkeer dat is, want alles wat een cache of CDN afvangt komt daar niet langs. Is er wel een access-log, dan blijft dat de bron en telt deze weg niet mee.
* De plugin kan nu vaststellen of er een CDN voor de site staat, ook als de server een intern adres heeft. Skeo meldt terug vanaf welk adres een verzending binnenkwam, en dat is van binnenuit niet te achterhalen.

= 1.7.15 =
* Crawlerbezoeken werden dubbel geteld na het omrollen van een logboek. Het weggerolde deel werd vanaf het begin opnieuw gelezen in plaats van vanaf het punt waar we gebleven waren. Op drukke sites gebeurt dat meermaals per dag, waardoor de cijfers opliepen zonder dat er verkeer bij kwam.

= 1.7.14 =
* Een correctie in de lijst met crawlerdomeinen werkt meteen. De onthouden uitkomsten van eerdere controles vervallen zodra die lijst verandert, in plaats van een dag lang de oude beoordeling te blijven geven.

= 1.7.13 =
* Amazon's crawler werd ten onrechte als bedrieger afgewezen, waardoor die volledig uit de tellingen verdween. Het domein waarop Amazon zijn crawler laat herkennen stond verkeerd in de lijst.
* Afgewezen verkeer wordt geteld. Klopt het domein van een crawler ooit niet meer, dan is dat nu te zien in plaats van dat die familie stil uit de cijfers zakt.

= 1.7.12 =
* De uitkomst van een herkomstcontrole wordt een dag onthouden. Op sites waar een crawler vanaf duizenden adressen langskomt ging bijna de hele leesbeurt op aan dezelfde opzoekingen als de ronde ervoor.

= 1.7.11 =
* De herkomstcontrole van crawlers werkt weer. Het tijdstip in een logregel werd aangezien voor het adres van de bezoeker, waardoor geen enkele crawler geverifieerd kon worden en al het verkeer als onbevestigd binnenkwam.

= 1.7.10 =
* Een achterstand aan crawlertellingen wordt nu in een keer weggewerkt in plaats van in een partij per uur. Op sites waar een crawler duizenden pagina's per dag ophaalt liep die achterstand anders op in plaats van in.
* De tellingen kennen naast een bewaartermijn ook een bovengrens, zodat een langdurig verbroken koppeling de database niet vol laat lopen.

= 1.7.9 =
* De verzending van crawlertellingen markeert pas als verzonden na een echte bevestiging van de ontvangkant. Een HTTP 200 zonder inhoudelijk antwoord telde eerder als geslaagd, waardoor tellingen konden verdwijnen zonder dat ze waren aangekomen.
* De terugmelding van de ontvangkant wordt bewaard, zodat zichtbaar is hoeveel er daadwerkelijk is opgeslagen.

= 1.7.8 =
* Onderhoud: de code achter het weghalen van een noindex is opgesplitst. Geen verandering in wat je ziet of kunt.

= 1.7.7 =
* Fix: draait je site met paginacache, dan bleef de oude versie van een pagina uitgeleverd nadat Skeo de noindex had weggehaald. De controle daarna zag de blokkade dus nog staan, en het leek alsof er niets gebeurd was. Skeo ruimt nu de opgeslagen kopie van die ene pagina op.

= 1.7.6 =
* Fix: bij Rank Math meldde Skeo dat een lege categorie weer zichtbaar was, terwijl de pagina op noindex bleef. Rank Math houdt lege categorieën tegen met een regel die over elke instelling op de pagina zelf heen gaat. Skeo zegt nu dat hij het niet kan omzetten, en noemt de drie wegen die wel werken.

= 1.7.5 =
* Fix: bij Yoast meldde Skeo dat een categorie weer zichtbaar was, terwijl de pagina op noindex bleef staan. Yoast toont zulke pagina's uit zijn eigen opgeslagen overzicht, en dat werd niet ververst. Skeo ruimt die opslag nu op, zodat Yoast de pagina opnieuw beoordeelt.

= 1.7.4 =
* Fix: draait je site All in One SEO zonder de betaalde versie, dan meldde Skeo bij een categorie dat er "geen SEO-plugin" was. Dat klopte niet: All in One SEO draait wel, maar kan in de gratis versie geen instelling per categorie bewaren. Skeo zegt dat nu, en noemt de plugins die het wel kunnen.

= 1.7.3 =
* Verbetering: staat een categorie op noindex omdat er geen berichten in zitten, dan zegt Skeo dat nu ook. Voorheen kreeg je alleen te horen dat de blokkade "ergens anders" zat en ging je in je SEO-plugin zoeken naar iets wat daar niet staat. Let op: worden de producten op zo'n pagina door een filterplugin ingeladen, dan telt je SEO-plugin die niet mee en staat de pagina onterecht op noindex.

= 1.7.2 =
* Fix: Skeo kon een noindex alleen weghalen op berichten en pagina's. Bij een categorie, tag of eigen taxonomie meldde hij dat de pagina niet meer bestond. Nu maakt het niet uit wat voor soort pagina het is.

= 1.7.1 =
* Fix: koppelde je vanuit een testomgeving van Skeo, dan meldde de plugin zich toch bij de productieomgeving. Je zag dan "verbonden" op je site, terwijl het scherm waar je vandaan kwam leeg bleef. De plugin onthoudt nu bij welke Skeo hij hoort en stuurt alles daarheen: de koppeling zelf, statuswijzigingen, metadata en het ontkoppelen.

= 1.7.0 =
* Feature: staat een pagina op "niet in Google tonen", dan kun je dat voortaan vanuit Skeo weghalen met een knop. Skeo zet de pagina expliciet op zichtbaar in de SEO-plugin die je site draait, en kijkt daarna meteen of Google hem weer oppakt. Pagina's die privé zijn of achter een wachtwoord staan blijven met rust, want daar hoort de blokkade. Staat je hele site in WordPress op "zoekmachines ontmoedigen", dan zegt Skeo dat, in plaats van pagina voor pagina te blijven proberen.
* Fix: draait je site Perfmatters met de REST-API dichtgezet, dan kon Skeo je site niet meer bereiken en leek de koppeling stuk. De connector meldt zichzelf nu aan op de uitzonderingenlijst van Perfmatters. Alleen de eigen adressen van Skeo gaan open, de rest van de REST-API blijft dicht zoals je het had ingesteld.
* Verbetering: SureRank wordt nu herkend als SEO-plugin. Skeo wist voorheen niet welke plugin er op zo'n site draaide en kon daardoor geen gerichte hulp geven.

= 1.6.7 =
* Fix: bij het kiezen van een veld op een categorie konden ook velden van andere plugins in de lijst staan, zoals een koppeling met je boekhouding of voorraad. Die horen daar niet: erin schrijven zou zo'n koppeling stukmaken. De lijst toont nu alleen de omschrijving en velden die echt voor tekst bedoeld zijn.

= 1.6.6 =
* Verbetering: de plugin werkt zichzelf voortaan bij. Updates verschijnen in het gewone updates-overzicht van WordPress en worden automatisch geïnstalleerd, zodat een nieuwe mogelijkheid in Skeo meteen werkt zonder dat je op je site iets hoeft te doen. Wil je dat liever niet, zet het dan uit met het filter `skeo_auto_update`.
* Verbetering: direct na een update geeft de plugin door aan Skeo wat deze versie kan, en bij elke synchronisatie welke versie er draait. Voorheen wachtte dat tot je toevallig een categorie of gebruiker aanpaste, waardoor Skeo soms weken met verouderde gegevens werkte en een update aanbood die je al had.
* Fix: het bijwerken van de plugin kon op een webshop met veel productcategorieën een foutmelding geven. De plugin ging meteen na de update de categorieën inventariseren, terwijl WordPress nog niet klaar was met opstarten. Dat doorgeven gebeurt nu aan het eind van de aanvraag, als alles geladen is.

= 1.6.0 =
* Feature: Skeo kan tekst nu ook naar een categoriepagina schrijven in plaats van naar een bericht of pagina. Handig voor webshops, waar de tekst van een productcategorie vaak niet in de standaard omschrijving staat maar in een eigen veld. De connector meldt aan Skeo welke velden een categorie heeft (de omschrijving, ACF-velden en losse eigen velden), zodat je in Skeo kunt aanklikken waar de tekst terecht moet komen.
* Feature: per veld geeft de connector door of het opmaak aankan. Een wysiwyg-veld en de omschrijving houden koppen, lijsten en afbeeldingen heel; een gewoon tekstveld krijgt platte tekst met de alinea-indeling erin, zodat er geen HTML-tags letterlijk op de pagina belanden.
* Feature: de afbeelding van een categorie kan meegezet worden vanuit Skeo. Alleen als je daar in Skeo expliciet voor kiest; anders blijft de huidige afbeelding staan.
* Verbetering: de omschrijving van een categorie behield voorheen alleen de opmaak die ook in reacties is toegestaan, waardoor koppen en lijsten verdwenen. Die worden nu bewaard, met dezelfde schoonmaak als een gewoon artikel.

= 1.5.1 =
* Fix: het opzoeken van een pagina op zijn pad kon de voorpagina teruggeven in plaats van niets, wanneer het pad nergens op uitkwam. Dat gebeurt zodra een post-type niet geregistreerd is, bijvoorbeeld omdat de plugin die het levert uitstaat. Skeo kreeg dan de homepage aangeboden als bron voor een herschrijving van een heel ander artikel. De connector controleert nu dat de gevonden pagina ook echt op het gevraagde pad staat, en valt anders terug op de slug.

= 1.5.0 =
* Feature: Skeo kan de tekst van een bestaande pagina ophalen, zodat een herschrijving begint met wat er nu op de site staat in plaats van met een leeg veld. De schrijver ziet de huidige tekst met de richtlijnen en de score ernaast, en de pagina houdt zijn URL en zijn plek op de site. De connector geeft de tekst terug zoals de bezoeker hem ziet, dus met shortcodes en blokken van een paginabouwer al uitgewerkt. Alleen gepubliceerde pagina's van publieke post-types.

= 1.4.2 =
* Verbetering: de Permalink Manager-slugcheck slaat nu correct over voor post-types die Permalink Manager niet beheert (die volgen de standaard WordPress-URL); voor zulke types wordt weer de standaard slug-check gebruikt. Voorkomt dat een dubbele URL onopgemerkt blijft op post-types buiten Permalink Manager.

= 1.4.1 =
* Verbetering: de slug-conflictdetectie werkt nu ook op sites met Permalink Manager (Pro). Deze plugin beheert een eigen URL-tabel los van de standaard WordPress-slug; voortaan checkt de connector die tabel zodat een dubbele URL óók daar netjes een keuze oplevert (bestaande pagina bekijken, URL aanpassen of overschrijven) in plaats van stil een "-2"-variant. Herkent ook een bezetter die in de prullenbak staat.

= 1.4.0 =
* Feature: slug-conflict-detectie bij publiceren. Bestaat er al een ander artikel met exact dezelfde URL-slug, dan maakt WordPress niet langer stil een "-2"-variant. In plaats daarvan geeft de connector een 409-conflict terug met de bestaande post-info, zodat Skeo de gebruiker laat kiezen: de slug aanpassen of de bestaande pagina overschrijven. Herpubliceren van hetzelfde Skeo-artikel (zelfde contentPageId) wordt herkend en gewoon als update afgehandeld — geen vals conflict.

= 1.3.6 =
* Feature: FAQ-schema (FAQPage JSON-LD) wordt automatisch toegevoegd aan gepubliceerde pagina's, afgeleid uit de vraag-kopjes in de content. Het schema beweegt mee wanneer de content op WordPress wordt aangepast (een bron van waarheid, geen losse kopie). De keuze welke vragen meedoen komt mee vanuit Skeo. Compatibel met SK FAQ: gebruikt een pagina het sk/faq-block of claimt een plugin de FAQ via de `skeo_faq_schema_handled`-filter, dan stapt de connector opzij.

= 1.3.0 =
* Feature: ondersteuning voor bovenliggende artikelen bij publiceren vanuit Skeo. Voor hiërarchische post-types (pagina's en hiërarchische CPTs) kan een parent-post worden meegegeven via `post.postParent`. Bij niet-hiërarchische types wordt de parent genegeerd; bij ongeldige parent (bestaat niet, ander post-type, of niet gepubliceerd) wordt de publish geweigerd met een duidelijke foutmelding.
* Feature: post-type metadata uitgebreid met `hierarchical`, `rewriteSlug` en `publishedCount` zodat Skeo de juiste UI kan tonen en URL-previews kan berekenen.
* Feature: snapshot-sync naar Skeo bevat nu `availableParentsByPostType` met top-500 parents per hiërarchisch post-type. Sites met meer parents krijgen `truncated: true`.
* Feature: nieuwe REST-route `GET /skeo/v1/parents?type=X&search=Y` als search-fallback voor sites met >500 parents per type.
* Plugin pusht automatisch een nieuwe metadata-snapshot bij wijzigingen op posts van een hiërarchisch post-type (save, trash, untrash, delete), met dezelfde debounce/throttle als bestaande sync.

= 1.2.7 =
* UX: woordkeuze in handshake-foutmelding gewijzigd van "meestal verlopen" naar "waarschijnlijk verlopen".

= 1.2.6 =
* UX: handshake-foutmelding bij mislukte koppeling is nu vriendelijker en bevat duidelijke instructies (ga naar app.skeo.nl, open project-instellingen, klik opnieuw op 'Koppelen') in plaats van de kale technische "Skeo afgewezen (HTTP X)" tekst. Technische details staan op een aparte regel onderaan voor debugging.
* UI: notice in de admin-pagina ondersteunt nu meerdere regels (nl2br).

= 1.2.5 =
* Fix (sk-shared): SK_Admin_Menu class_exists guard, voorkomt fatal "Cannot declare class SK_Admin_Menu, because the name is already in use" wanneer meerdere SK-plugins (zoals SK Breadcrumb of SK Redirections) op dezelfde site actief zijn. Zelfde fix als sk-redirections 1.3.1.

= 1.2.4 =
* Fix: disconnect-call naar Skeo is nu blocking. Eerder kon de fire-and-forget request voortijdig worden afgebroken door het einde van het PHP-admin-proces, waardoor Skeo de ontkoppeling niet zag en de koppeling daar nog actief leek.

= 1.2.3 =
* SKEO_API_BASE wijst naar productie (https://app.skeo.nl) i.p.v. staging.

= 1.2.2 =
* Beveiliging: /skeo/v1/set-status accepteert nu alleen status-wijzigingen voor posts die door Skeo zijn gepubliceerd (cross-check op _skeo_content_page_id post-meta). Voorkomt dat een gecompromitteerd Skeo-account willekeurige WordPress-posts kan muteren.

= 1.2.1 =
* Fix: ingeplande publicaties verschenen 2 uur te vroeg in WordPress (in CEST). post_date werd met UTC-tijd gevuld in plaats van de lokale site-tijd. Gebruikt nu get_date_from_gmt() voor de juiste conversie.

= 1.2.0 =
* Skeo → WP status sync: wanneer een artikel in Skeo terug van "gepubliceerd" of "ingepland" naar een eerdere status gaat, wordt de WordPress-post automatisch op "concept" gezet. Eerder bleef de live-post staan ondanks dat hij in Skeo niet meer live was.
* Nieuw REST endpoint /skeo/v1/set-status met loop-prevention zodat de WP → Skeo status-sync niet onmiddellijk terug-pingt.

= 1.1.0 =
* Metadata-push naar Skeo bij installatie en bij wijziging (created_term, edited_term, delete_term, user_register, profile_update, deleted_user). Skeo's publiceer-modal opent voortaan instant en hoeft de WP REST API niet meer aan te roepen voor post-types, auteurs, categorieën en tags.
* Connected user (degene die de koppeling heeft gemaakt) wordt nu doorgegeven aan Skeo, zodat de modal de echte accountnaam toont in plaats van "site-standaard".
* Plugin REST: /post-types, /categories en /authors zijn verwijderd (data komt via push). /tags blijft als fallback-search voor sites met >2000 tags.

= 1.0.0 =
* Eerste publieke release.
* One-time-code handshake met HMAC-SHA256-signing en 10-minuten TTL.
* SHA-256-token-hash voor incoming auth; AES-256-CBC obfuscation voor outgoing calls.
* Automatische SEO-plugin-detectie (Yoast / Rank Math / AIOSEO).
* Automatische page-builder-detectie (Divi / Elementor / Beaver / Oxygen / WPBakery).
* Media-upload met SHA-256(url) deduplicatie.
* Native Gutenberg-blocks parser voor headings, paragrafen, lijsten en afbeeldingen.
* SSRF-bescherming en MIME-validatie op media-uploads.
* Symmetrische disconnect: ontkoppelen in WordPress informeert Skeo automatisch.
* Update-notice bij beschikbare nieuwere plugin-versie.

== Upgrade Notice ==

= 1.2.0 =
WordPress-post wordt nu automatisch op concept gezet wanneer je in Skeo de status terug zet.

= 1.1.0 =
Snellere publiceer-modal in Skeo: metadata wordt nu vanuit WordPress gepusht in plaats van live opgevraagd.

= 1.0.0 =
Eerste release van Skeo Connector.
