=== Webstudio SEO Pro ===
Contributors: webstudio
Tags: seo, meta tags, open graph, twitter cards, sitemap, robots.txt
Requires at least: 5.8
Tested up to: 6.8
Requires PHP: 7.4
Stable tag: 3.9.103
License: Proprietary

Profesionálny SEO plugin s automatickými meta tagmi, Open Graph, Twitter Cards, robots.txt, sitemap.xml a llms.txt.

== Description ==

Webstudio SEO Pro je kompletný SEO plugin pre WordPress s moderným rozhraním inšpirovaným najlepšími SEO pluginmi.

**Hlavné funkcie:**

* ✅ Automatické Meta Title a Description
* ✅ Open Graph tagy pre Facebook, LinkedIn
* ✅ Twitter Cards
* ✅ Automatický robots.txt
* ✅ XML Sitemap generátor
* ✅ llms.txt pre AI boty (ChatGPT, Claude...)
* ✅ Podpora pre Gutenberg, Elementor, Themify Builder
* ✅ WooCommerce integrácia
* ✅ Noindex/Nofollow nastavenia
* ✅ Canonical URL
* ✅ Tabové rozhranie v editore

== Installation ==

1. Nahrajte plugin do priečinka `/wp-content/plugins/`
2. Aktivujte plugin cez menu 'Pluginy'
3. Prejdite do SEO Pro → Globálne SEO pre nastavenia

== Changelog ==

= 3.9.103 - Júl 2026 =
* 🔗 **Článok teraz dedí z kategórie aj `mentions` (nielen `about`).** Doteraz článok bez vlastných spomínaných entít bral len tagy; teraz najprv zdedí `mentions` z primárnej kategórie (vrátane rodiča), rovnako ako `about`. Poradie: ručne zadané → zdedené z kategórie → tagy. Tým je dedenie z kategórie do článku plné — presne ako kategória → podkategória.

= 3.9.102 - Júl 2026 =
* 🐛 **Oprava Google upozornenia „Neplatný typ objektu pre pole category" na produktoch.** Entita z produktovej kategórie sa vkladala do `Product.category` ako objekt `Thing` — lenže Google pri produkte očakáva `category` ako obyčajný text, takže to hlásil (nezávažné, ale škaredé). Entita sa teraz vkladá do **`WebPage.about` / `mentions`** produktovej stránky (tam je objekt `Thing` platný), nie do `Product` uzla. Výsledok: produkt má entitu (pre Google/AI aj s dedením z kategórie), ale bez upozornení. `Product` schéma je čistá.

= 3.9.101 - Júl 2026 =
* 🌳 **Aj `mentions` sa teraz dedia z rodičovskej kategórie do podkategórií** (rovnako ako `about`). Ak podkategória (napr. Revolvery pod Airsoft) nemá vlastné spomínané entity, prevezme ich od nadradenej kategórie. Vlastné mentions podkategórie majú prednosť.

= 3.9.100 - Júl 2026 =
* 🐛 **Oprava štruktúry entít na kategórii — každá entita samostatne + pole `mentions`.** Doteraz pole na kategórii zlúčilo VŠETKY odkazy pod JEDNU entitu (jeden `Thing` s obrovským `sameAs` zoznamom), čo je sémanticky zle — rôzne veci (SEO, Google, Sémantický web…) nie sú tá istá entita. Teraz **každý riadok = jedna samostatná entita** (`Thing` s vlastným názvom a vlastným `sameAs`) — presne ako pri článkoch. Viac odkazov k tej **istej** veci (napr. Wikipédia + Wikidata) dáš na jeden riadok cez `|`. Pribudlo aj druhé pole **„Spomínané entity (mentions)"**, ktoré sa vypíše ako `mentions`. Výstup `about`/`mentions`/`Product.category` je teraz pole samostatných entít (alebo jedna entita, ak je len jedna). **Pozor:** ak máš staré dáta ako holé odkazy pod jedným názvom, prepíš ich do formátu `Názov | odkaz` (jedna entita na riadok), inak dostanú názov kategórie.

= 3.9.99 - Júl 2026 =
* 💅 **Drobnosť — placeholder poľa entity.** Ukážka v poli teraz zobrazuje formát <code>Názov | odkaz</code> na oboch riadkoch (aj pri Wikidata), nech je príklad úplne konzistentný.

= 3.9.98 - Júl 2026 =
* ✏️ **Zjednotený formát poľa entity — „Názov | odkaz".** Pole Wikipedia/Wikidata na kategórii/značke teraz používa **rovnaký formát ako pri článkoch**: <code>Názov | odkaz</code> (napr. <code>Gore-Tex | https://sk.wikipedia.org/wiki/Gore-Tex</code>), jeden na riadok. **Názov je nepovinný** — ak napíšeš len odkaz, doplní sa názov kategórie. Viac odkazov (Wikipédia + Wikidata) môžeš dať za seba oddelené <code>|</code> alebo na ďalší riadok. Nápoveda aj placeholder v poli to teraz jasne ukazujú.

= 3.9.97 - Júl 2026 =
* 🌳 **Entita sa dedí od rodičovskej kategórie do podkategórií.** Ak podkategória nemá vlastnú entitu, automaticky prevezme Wikipedia/Wikidata entitu najbližšej nadradenej kategórie. Stačí ju vyplniť na hlavnej kategórii (napr. „Gore-Tex") a všetky podkategórie („Gore-Tex bundy", „Gore-Tex nohavice") ju zdedia. Vlastná entita podkategórie má vždy prednosť.
* 🛒 **Entita z produktovej kategórie sa prenáša aj do PRODUKTOV.** Produkt teraz v schéme dostane `Product.category` ako entitu (`Thing` so `sameAs` na Wikipedia/Wikidata) podľa svojej primárnej produktovej kategórie — vrátane dedenia od nadradenej kategórie. (Používame `category`, nie `about` — `about` nie je pri Product platná vlastnosť; `category` je a nesie tú istú entitu pre Google aj AI.) Platí pre jednoduché aj variabilné produkty.
* 🔗 **Dedenie entity do článku rozšírené o rodiča kategórie.** Fallback z 3.9.96 teraz zdedí entitu aj z nadradenej kategórie, nielen z priamej.

= 3.9.96 - Júl 2026 =
* 🔗 **Entita z kategórie sa dedí do článku (Wikipedia/Wikidata `sameAs`).** Nadväzuje na 3.9.95. Ak článok nemá vlastnú ručne zadanú entitu, jeho `about` sa už predtým dopĺňal z primárnej kategórie — teraz sa navyše zdedí aj **Wikipedia/Wikidata odkaz** (`sameAs`) tej kategórie, takže téma článku je pre Google/AI jednoznačne identifikovaná. Stačí vyplniť entitu **raz na kategórii** a všetky články v nej ju automaticky prevezmú. **Ručná entita článku má vždy prednosť** (najpresnejšia). Produktov sa to netýka — Product schéma `about` nepoužíva; produkt je s kategóriou/entitou prepojený cez omrvinky (BreadcrumbList) a značku.

= 3.9.95 - Júl 2026 =
* ✨ **Entity linking (Wikipedia/Wikidata) pre kategórie a značky — voliteľné.** Pri úprave **kategórie, produktovej kategórie alebo značky** pribudlo nepovinné pole „Wikipedia / Wikidata URL (about)". Ak ho vyplníš (jeden odkaz na riadok), pridá sa do schémy stránky (`CollectionPage`) ako `about → Thing → sameAs` — sémantický signál, ktorý Googlu jednoznačne povie, o akú reálnu entitu ide (Knowledge Graph, relevancia). **Vypĺňaj len tam, kde kategória/značka SKUTOČNE je entita s heslom na Wikipédii** (napr. Gore-Tex, Merino, Softshell); pri komerčných/akciových kategóriách nechaj prázdne. Prázdne pole = nič sa nepridá. Funguje pre `category`, `product_cat` a značkové taxonómie (`product_brand`, `pwb-brand`, `yith_product_brand`), ak existujú.

= 3.9.94 - Júl 2026 =
* 🧹 **Vypnutý natívny WordPress sitemap (`/wp-sitemap.xml`) — koniec duplicity.** WordPress od verzie 5.5 generuje vlastný sitemap, ktorý bežal **súčasne** s naším `/sitemap.xml` — dva paralelné sitemap systémy (natívny navyše vytváral aj `wp-sitemap-users-*.xml`, ktorý zbytočne odhaľoval autorov/používateľov). Plugin teraz natívny sitemap vypína (`wp_sitemaps_enabled`), takže na webe je **jediný, správny** sitemap — ten náš, na ktorý ukazuje aj robots.txt.

= 3.9.93 - Júl 2026 =
* 🐛 **Oprava sitemapov na WooCommerce weboch — produkty a obrázky.** Virtuálne súbory sa generovali na `init` s prioritou 0, teda **skôr, ako WooCommerce zaregistroval produkty** (init:5). Dôsledok: produktový sitemap vypisoval škaredé `?p=ID` odkazy (Google dostával presmerovania) a **image sitemap bol prázdny** (produkty z neho vypadli → „Mapa webu obsahuje chyby"). Presunuté na prioritu 99 — produkty teraz majú v sitemape správne pekné URL a obrázky produktov sa do image sitemapu dostanú. (Prejaví sa len na e-shopoch; bežné weby to nemali.)
* 🐛 **Product schema — oprava „Neplatné číslo pohyblivej rádovej čiarky" (shippingRate).** Cena dopravy sa v schéme vypisovala so slovenskou čiarkou („4,90"), čo Google odmieta. Teraz sa normalizuje na platný formát s bodkou („4.90").
* ✨ **Product schema — doplnené polia, ktoré Google odporúčal.** Pridané `validFrom` do ponúk (offers aj priceSpecification) a na **každom variante** teraz je `brand` + `mpn` — rieši upozornenia „Chýbajúce pole validFrom" a „Nebol poskytnutý žiadny globálny identifikátor". Pri jednoduchých produktoch bez GTIN/MPN sa ako MPN použije SKU (aby dvojica značka+MPN tvorila platný identifikátor).

= 3.9.92 - Júl 2026 =
* 🧭 **Presnejšia navigácia v návode na Merchant Center (podľa aktuálneho rozhrania).** Feed sa pridáva cez **Nastavenia → Zdroje údajov** (nie „Produkty → Feeds") a overenie/nárokovanie webu cez **Nastavenia → Informácie o firme** (nie „Firemné údaje"). Text krokov 2 a 3 v návode je opravený tak, aby sedel s aktuálnym Google Merchant Center.

= 3.9.91 - Júl 2026 =
* 🔗 **Oprava odkazu na Merchant Center v návode.** Tlačidlá „Otvoriť Merchant Center →" viedli na `merchant.google.com` (nesprávne) — opravené na správnu adresu **`merchants.google.com`**.

= 3.9.90 - Júl 2026 =
* 🔀 **Google Merchant feed presunutý z Globálneho SEO do sekcie Marketing.** Celý blok „Google Merchant feed" (URL feedu, predvolená značka aj 5-krokový návod na pridanie do Merchant Center) sa presunul na stránku **Marketing**, kde logicky patrí vedľa ostatných predajných funkcií (push notifikácie, newsletter, WooCommerce marketing). Funkčnosť je nezmenená — predvolená značka sa teraz ukladá cez formulár Marketingu (netreba nič prenastavovať, uložené hodnoty ostávajú).

= 3.9.89 - Júl 2026 =
* 📋 **Návod „Ako pridať feed do Google Merchant Center" priamo v Globálnom SEO.** Ku karte Google Merchant feed pribudol prehľadný **5-krokový sprievodca** (rovnaký štýl ako pri Google Indexing API / Search Console): 1. vytvoriť účet v Merchant Center, 2. overiť a nárokovať web (rovnakým meta tagom ako pri Search Console), 3. pridať zdroj produktov cez „Naplánované sťahovanie", 4. vložiť URL feedu (zobrazená priamo v návode na skopírovanie) a nastaviť frekvenciu, 5. počkať na spracovanie. Vrátane tlačidiel „Otvoriť Merchant Center →" a upozornenia, čo treba pripraviť (aktívne WooCommerce + Google účet). Nastavenie je jednorazové, feed sa potom sťahuje automaticky.

= 3.9.88 - Júl 2026 =
* ✖️ **„Zrušiť import" — upozornenie na import z iných SEO pluginov sa dá natrvalo skryť.** Modré upozornenie „nájdené SEO dáta na import" (na stránke Pluginy a WP nástenke) malo doteraz len tlačidlo „Spustiť import →" a zobrazovalo sa stále dokola. Pribudlo tlačidlo **„Zrušiť import"** — po kliknutí sa upozornenie aj sprievodca importom **natrvalo skryjú** (žiadne ďalšie vyskakovanie). Import zostáva k dispozícii — v samotnom sprievodcovi na SEO Dashboarde bolo možné zamietnuť aj jednotlivé zdroje samostatne. (Ak by ste import chceli neskôr znova ponúknuť, stačí povedať — obnoví sa vymazaním nastavenia `wseo_dismissed_migrations`.)

= 3.9.87 - Júl 2026 =
* 🧹 **Oprava duplicity — Meta Title a Meta Description pri produktoch.** Pri WooCommerce produktoch sa polia **Meta Title** a **Meta Description** zobrazovali dvakrát: raz vo WooCommerce paneli („Údaje o produkte → Všeobecné") a raz v hlavnom **Webstudio SEO Pro** bloku pod editorom. Obidve pritom zapisovali do **toho istého** miesta, takže išlo len o mätúci vizuálny duplikát. Polia sme z WooCommerce panelu **odstránili** — Meta Title/Description sa teraz nastavujú výhradne v hlavnom Webstudio SEO Pro bloku (jednotné miesto ako pri článkoch a stránkach). **Žiadne dáta sa nestrácajú** — už vyplnené hodnoty ostávajú a naďalej sa upravujú v hlavnom bloku. Editoriálna recenzia (Google Rich Results) ostáva vo WooCommerce paneli bez zmeny.

= 3.9.86 - Júl 2026 =
* 🛒 **Google Merchant feed — produkty do Google Shopping (bezplatné výpisy „hore" vo vyhľadávaní).** Pre WooCommerce e-shopy pribudol automatický **produktový feed** na URL `/wseo-google-feed.xml`, ktorý sa pridá do **Google Merchant Center** (Produkty → Feeds → naplánované sťahovanie / scheduled fetch — bez API kľúča a bez OAuth, Google si ho sám pravidelne stiahne). Feed generuje **všetky publikované produkty vrátane variácií** (variácie spojené cez `item_group_id`) a posiela názov, popis, odkaz, cenu aj **akciovú cenu** (rešpektuje nastavenie daní), dostupnosť (skladom / na objednávku / vypredané), hlavný aj galériové obrázky, **brand** (z taxonómie značiek, atribútu alebo predvolenej značky), **GTIN/EAN** (natívne WooCommerce 9.2+ aj bežné meta kľúče), **MPN** a cestu **kategórie**. V Globálnom SEO pribudla karta „Google Merchant feed" s URL feedu a poľom **predvolená značka** pre produkty bez vlastného brandu. (Product schéma pre jednotlivé produkty už bola kompletná — toto dopĺňa hromadný feed pre celý katalóg.)

= 3.9.85 - Júl 2026 =
* 🐛 **Import z iných SEO pluginov (Yoast, Rank Math, All in One SEO, SEOPress, The SEO Framework) — OPRAVENÉ.** Sprievodca importom bol v kóde, ale len v **starej, nepoužívanej** šablóne dashboardu (metóda `render_dashboard_page`, ktorá sa nikde nevolala) → nikdy sa nezobrazil, preto import „nefungoval vôbec". Teraz sa **sprievodca zobrazuje priamo na SEO Dashboarde** (keď sa detekujú SEO dáta z iného pluginu) a navyše sa **po zapnutí objaví výrazný notice** (na stránke Pluginy a na WP nástenke) s tlačidlom „Spustiť import →". Import prenesie tituly, meta popisy, kľúčové slová, canonical, noindex/nofollow aj OG obrázok. Notice/sprievodca zmizne po importe alebo zamietnutí.

= 3.9.84 - Júl 2026 =
* ✨ **Organization schéma — publishingPrinciples + correctionsPolicy (E-E-A-T „trust" signály).** V Globálnom SEO (pri knowsAbout / additionalType) pribudli 2 nepovinné polia: **Redakčné zásady** (odkaz na stránku o tom, ako tvoríte a overujete obsah) a **Politika opráv** (odkaz na stránku o opravách a faktickej presnosti). Ak ich vyplníš, vypíšu sa v Organization schéme ako `publishingPrinciples` a `correctionsPolicy` — dôveryhodnostné signály, ktoré Google aj AI zohľadňujú pri E-E-A-T. (sameAs, knowsAbout aj additionalType už plugin generuje; Product schéma pre Google Shopping je tiež kompletná.)

= 3.9.83 - Júl 2026 =
* 💅 **E-E-A-T box a TOC — okraj sa automaticky prispôsobí pozadiu.** Okraj (border) boxu aj TOC je teraz jemný **odtieň zvoleného pozadia** (pri svetlom pozadí mierne tmavší, pri tmavom mierne svetlejší) — takže vždy ladí a už nevytŕča sivá čiara na farebnom pozadí. Rovnako sa prispôsobí aj oddeľovacia čiara pri „odborne skontroloval". Netreba nič nastavovať, počíta sa z pozadia automaticky.

= 3.9.82 - Júl 2026 =
* 💅 **Farby E-E-A-T presunuté do bloku „Predvolené údaje autora/zakladateľa (Person)".** Nastavenie 3 farieb (pozadie, text, odkazy) je teraz priamo v Person karte ako podsekcia (oddelené čiarou), nie ako samostatná karta.

= 3.9.81 - Júl 2026 =
* ✨ **E-E-A-T box a obsah (TOC) — 3 nastaviteľné farby.** V Globálnom SEO → nová karta **„🎨 Farby E-E-A-T boxu a obsahu (TOC)"** s tromi farbami: **pozadie** (platí pre autorský box aj box s obsahom článku), **farba textu** (pre oba) a **farba odkazov** (pre TOC). Farby sa dajú vybrať klasickým výberom farby a bezpečne sa uložia (len hex). Text v boxe sa prispôsobí zvolenej farbe (aj na tmavom pozadí ostane čitateľný). Predvolené: pozadie #f6f7f7, text #333333, odkazy #2271b1 — takže bez nastavovania vyzerá všetko ako doteraz.

= 3.9.80 - Júl 2026 =
* 🔧 **Dĺžka obsahu — dlhý obsah už NIE je problém + minimum 500 slov.** Kontrola dĺžky prestala flagovať dlhý obsah ako varovanie — hláška „Obsah je veľmi dlhý… Zvážte rozdelenie na viac článkov" je **preč** (dlhý kvalitný obsah SEO neškodí, práve naopak). Nie je žiadny horný strop. Minimum pre „dostatočnú dĺžku" je teraz **500 slov** (článok/stránka); pod ~250 slov = príliš krátky. Produkty (e-shop) ostávajú s nižším prahom (krátke popisy produktov sú v poriadku).
* 🔧 **llms.txt — „Produkty a služby" ako odrážky.** V generovanom `llms.txt` sa produkty a služby vypíšu ako **správne odrážky** (každá na samostatnom riadku), nie zliate do jedného riadku. Prípadná pomlčka/odrážka napísaná v poli sa normalizuje.

= 3.9.79 - Júl 2026 =
* 🔧 **Core Web Vitals — posledné 3 vzorky (medián) + meranie mobilu na klik.**
* **(1) Medián z posledných 3 meraní** namiesto p75 zo 100 — pri tvorbe a úpravách webu čísla reagujú takmer okamžite a jeden náhodný výkyv (napr. studená cache) ich nerozhodí. Drží sa len posledných 3 vzoriek na metriku a zariadenie.
* **(2) Tlačidlo obnoviť teraz aktívne ZMERIA zvolené zariadenie** (Mobil/Desktop): nakrátko otvorí domovskú stránku v malom okne, odmeria LCP/CLS a okno zavrie. Takže **mobil vieš zmerať aj bez telefónu** — prepni na záložku „Mobil" a klikni na obnoviť. (Malé okno = samostatné okno prehliadača, kde sa dá LCP zmerať — na rozdiel od skrytého rámca, kde to prehliadač neumožňuje.) Ak prehliadač blokuje vyskakovacie okná, len sa znovu načítajú uložené dáta; mobil sa tak či tak plní automaticky aj z reálnych mobilných návštev.

= 3.9.78 - Júl 2026 =
* 🔧 **Core Web Vitals — čistejšie + spoľahlivejší automatický zber.** Odstránený informačný text pod kartami (na želanie). Meranie beží plne **automaticky pri každom zobrazení webu** (tvojom aj návštevníkov) — netreba nič otvárať ani nastavovať; dáta pribúdajú z bežnej prevádzky. Pridaná poistka: namerané hodnoty sa odošlú aj po 15 s od načítania (predtým až pri zatvorení/prepnutí karty), takže sa zachytia aj z dlho otvorených kariet. (Pozn.: LCP/CLS/INP sa dajú odmerať len pri skutočnom načítaní stránky reálnym prehliadačom — nedá sa to „nasimulovať" na pozadí bez návštevy, preto sa dáta objavia po prvom zobrazení webu.)

= 3.9.77 - Júl 2026 =
* ✨ **Core Web Vitals sa merajú NA POZADÍ priamo v prehliadači — bez API kľúča.** Namiesto PageSpeed Insights API (ktoré bez vlastného kľúča naráža na zdieľaný, často vyčerpaný denný limit) sa LCP/CLS/INP teraz merajú knižnicou **web-vitals priamo pri načítaní tvojho webu reálnymi návštevníkmi** (RUM) a posielajú sa na pozadí cez `sendBeacon`. Žiaden kľúč, žiaden limit, zadarmo navždy. Na SEO Dashboarde sa zobrazuje **p75** (75. percentil — presne ako to počíta Google) zvlášť pre **mobil a desktop** (prepínač). Dáta sa objavia po prvej návšteve webu (INP až po interakcii). CLS sa počíta cez session-window a INP ako najhoršia interakcia (rovnako ako web-vitals). Odstránené pole na PageSpeed API kľúč — už nie je potrebné.

= 3.9.76 - Júl 2026 =
* ✨ **SEO Dashboard: Core Web Vitals (LCP, CLS, INP) vedľa tachometra a kontrol.** Karta „SEO Kontrola" má teraz tretí stĺpec so skutočnými Core Web Vitals z Google **PageSpeed Insights API** — LCP, CLS a INP, farebne (dobré / vyžaduje zlepšenie / slabé). Prednostne **terénne dáta (CrUX — reálni návštevníci, presne to na čom Google reálne hodnotí)**; ak web nemá dosť návštev pre terénne dáta, zobrazia sa laboratórne (Lighthouse) hodnoty (INP je len terénne → „—"). Prepínač **Mobil/Desktop**, tlačidlo obnoviť, výsledok sa **cachuje 12 h** (PSI volanie je pomalé → beží asynchrónne, dashboard sa nezdrží). Voliteľné pole na **PageSpeed API kľúč** (zadarmo v Google Cloud) — bez vlastného kľúča je anonymný denný limit zdieľaný a často vyčerpaný; s kľúčom sú dáta spoľahlivé.

= 3.9.75 - Júl 2026 =
* 🛡️ **Aktualizácia už NEZMAŽE nastavenia (Google Indexing JSON, Google Search Console prihlásenie, globálne SEO…).** Pri aktualizácii štýlom „deaktivovať → zmazať → nahrať nový zip → aktivovať" krok „zmazať" spúšťal `uninstall.php`, ktorý plošne mazal **všetky `wseo_*` options** — takže po každej aktualizácii vypadli všetky nastavenia a museli sa vypĺňať nanovo. Po novom `uninstall.php` **predvolene nezmaže žiadne nastavenia ani dáta** (vyčistí len osirelé naplánované cron úlohy); options/dáta sa zmažú LEN ak to používateľ výslovne zapne cez `wseo_delete_data_on_uninstall`. Po reinštalácii tak všetko ostane zachované. (Pozn.: účinné od tejto verzie ďalej — starý `uninstall.php` už na weboch je, takže pri prechode NA túto verziu radšej prepíš súbory namiesto „zmazať a nahrať".)

= 3.9.74 - Júl 2026 =
* 🔧 **Instant Indexing — log sa teraz zapíše spoľahlivo na KAŽDOM hostingu (predtým sa na niektorých weboch neukázal vôbec).** Automatické indexovanie pri publikovaní posielalo pingy a zapisovalo log až cez naplánovaný WP-Cron event (`wp_schedule_single_event` + `spawn_cron`). Ten však na mnohých hostingoch nefunguje spoľahlivo — WP-Cron býva vypnutý (`DISABLE_WP_CRON`), loopback na `wp-cron.php` je blokovaný (firewall, staging s heslom, DNS), alebo je web plne cachovaný (žiadne PHP návštevy) → event sa **nikdy nespustil a log ostal prázdny**, hoci pripojenie, test aj manuálny ping (synchrónne) fungovali. Pingy + log teraz bežia na `shutdown` toho istého publikačného requestu — najprv sa odošle odpoveď prehliadaču (`fastcgi_finish_request` / `litespeed_finish_request`, takže publikovanie ostáva rýchle), potom prebehnú pingy a zapíše sa log — **bez závislosti na WP-Crone**. (Manuálny „Indexovať teraz" aj test fungovali aj predtým — tie sú synchrónne.)

= 3.9.73 - Júl 2026 =
* 💅 **SEO Dashboard prerobený na celú šírku — veľký farebný kruh preč, štatistiky pod SEO Kontrola.** Odstránený veľký „skóre kruh" vľavo (skóre je aj tak v tachometri v karte SEO Kontrola). Štatistiky webu (Článkov, Stránok, S kľúč. slovom, S int. odkazmi, Presmerovaní, Čitateľnosť) sú teraz vo vlastnej karte **pod SEO Kontrola** a **roztiahnu sa na celú šírku**. Dashboard je jednostĺpcový (celá šírka), nie stlačený v úzkom stĺpci vľavo. Z hlavičky odstránené tlačidlo „Obnoviť dáta" aj indikátor „Z cache / Čerstvé dáta".

= 3.9.72 - Júl 2026 =
* 💅 **SEO Kontrola — vyváženejšie rozloženie (≈35/65) + väčší tachometer.** Tachometer vľavo je teraz výraznejší (zaberá ~tretinu šírky, responzívne sa prispôsobí veľkosti karty) a je zvislo vycentrovaný vedľa zoznamu kontrol; kontroly vypĺňajú pravé ~dve tretiny. Predtým bol tachometer stlačený v úzkom stĺpci vľavo a vpravo zostávalo prázdno.

= 3.9.71 - Júl 2026 =
* 💅 **SEO Dashboard → SEO Kontrola prerobená do rozloženia ako vo v4: tachometer vľavo, kontroly vpravo.** Vľavo je náš polkruhový tachometer so skóre „NN/100" (farebné zóny, ručička) + hodnotenie (Slabé/Priemerné/Výborné SEO). Vpravo sú **všetky kontroly vypísané ako body** — chyby (X), varovania (!) aj úspešné (fajka), so SVG ikonkami ako vo v4. Rozbaľovací zoznam „N položiek v poriadku" je preč — všetko je rovno vidieť. Kontroly a dáta sú z 3.9 (bez zmeny obsahu).

= 3.9.70 - Júl 2026 =
* 🔧 **Rýchla úprava (Quick Edit) — Focus Keyword pri produkte ukáže názov produktu.** V rýchlej úprave produktu sa v poli Focus Keyword ako nápoveda (placeholder) zobrazovali auto-extrahované slová oddelené čiarkou (napr. „zásobník, glock, gen5"). Teraz sa — rovnako ako v editore a v analýze — pri produkte zobrazí **názov produktu** (napr. „Zásobník Glock 19 Gen5 CO2"). Bežné príspevky a stránky: auto-extrakt ako doteraz.

= 3.9.69 - Júl 2026 =
* 🔧 **Produkty — fokusové kľúčové slovo je teraz CELÝ názov produktu (nie len prvá časť).** Nadväzuje na 3.9.68: keď sa pri produkte použije názov ako fokusové kľúčové slovo, berie sa **celý názov ako jedno kľúčové slovo** — napr. „Podpažné puzdro, kožené, Denix". Predtým čiarka v názve rozdelila keyword a ostalo len „Podpažné puzdro". Pri produktoch sa čiarky v názve už neberú ako oddeľovač viacerých keywords (platí pre live skóre v editore, budík v zozname aj hustotu). Bežné príspevky a stránky (kde čiarka = viac keywords) ostávajú bez zmeny.

= 3.9.68 - Júl 2026 =
* ✨ **Produkty — fokusové kľúčové slovo automaticky padne na názov produktu.** Ak pri WooCommerce produkte nevyplníš „Focus Keyword", SEO analýza (live skóre v editore, budík v zozname aj hustota kľúčového slova) použije **názov produktu** ako fokusové kľúčové slovo. Predtým sa produkt s prázdnym poľom hodnotil bez kľúčového slova. Bežné príspevky a stránky ostávajú bez zmeny (prázdne = prázdne / auto-extrakt). V metaboxe pole ukazuje nápovedu „prázdne = použije sa názov produktu".

= 3.9.67 - Júl 2026 =
* 🐛 **URL s diakritikou (Wikipedia/Wikidata) sa už neničia — zachová sa percent-encoding.** WordPress `sanitize_textarea_field` odstraňuje z textu každé `%XX`, čím rozbíjal odkazy s diakritikou (napr. `https://sk.wikipedia.org/wiki/Webov%C3%BD_dizajn` → `.../Webov_dizajn`, teda „Webový" → „Webov"). Postihovalo to **5 polí s URL**: Sociálne siete autora, Hlavná téma (about), Spomínané entity (mentions), additionalType a globálne Sociálne siete osoby. Teraz sa ukladajú cez sanitizáciu, ktorá `%` zachová (HTML tagy aj tak odstráni). Existujúce hodnoty stačí raz znova uložiť. (Organizačné sameAs cez `esc_url_raw` boli v poriadku už predtým.)

= 3.9.66 - Júl 2026 =
* ✨ **Organizácia — nové polia `knowsAbout` + `additionalType` (entity/GEO SEO).** V Globálne SEO → Schema (pod „Obrázok organizácie") pribudli dve polia: **Odborné témy firmy (knowsAbout)** — oblasti, ktorým sa firma venuje (oddelené čiarkou) — a **Typy / odbornosť (additionalType)** — odkazy na Wikipédiu / Wikidata (jeden na riadok). Vypíšu sa v Organization/LocalBusiness schéme **pod `image`**, čím Googlu aj AI presnejšie určíš, čím sa firma zaoberá (rovnaký signál, aký používajú silné SEO weby). Doteraz `knowsAbout` mal len autor článku (Person) — teraz ho má aj samotná firma. Neplatné (ne-URL) riadky v `additionalType` sa ignorujú.

= 3.9.65 - Júl 2026 =
* 🐛 **worksFor (Zamestnávateľ) — fallback berie názov Organizácie, nie WordPress „názov webu".** Keď autor nemá vyplnené pole Zamestnávateľ ani firmu v „Pozícia / Titul", `worksFor` sa doplní z **názvu Organizácie** (Globálne SEO → Schema → pole „Názov"), nie z WordPress „názov webu" (Nastavenia → Všeobecné). Tie dva sa často líšia (napr. „Webstudio s.r.o." vs „Webstudio Blog"). Platí pre Author schému aj site-wide Person; podľa názvu Organizácie sa rozhoduje aj doplnenie `url` k `worksFor`.

= 3.9.64 - Júl 2026 =
* 🐛 **Autor box (E-E-A-T) — kontakt v boxe teraz rešpektuje per-článok polia Email/Telefón.** Po pridaní dedikovaných polí Email a Telefón (3.9.63) ich Author Schema používala správne, ale **ikonky kontaktu v autor boxe** na frontende ich ignorovali a ťahali kontakt stále z globálnych nastavení. Teraz box aj schéma používajú **rovnakú prioritu: per-článok pole Email/Telefón → globálne Person pole**. Pozn.: prázdne pole = dedí globál (sivý text v poli je len placeholder, nie hodnota) — ak chceš iný kontakt než globálny, vyplň pole na článku.

= 3.9.63 - Júl 2026 =
* ✨ **E-E-A-T autor — nové polia Email, Telefón a Zamestnávateľ + tučná pozícia v boxe.** V E-E-A-T metaboxe (per článok) pribudli tri polia: **Email** a **Telefón** (nad sociálnymi sieťami) a **Zamestnávateľ**. Prenášajú sa do Author Schema — `email` a `telephone` (nad `sameAs`) a `worksFor` z poľa Zamestnávateľ (ak je prázdne, použije sa firma z „Pozícia / Titul" za čiarkou, inak názov webu). Prázdne polia dedia globálne nastavenia. V autor boxe na frontende sa teraz **pozícia a zamestnávateľ zobrazujú tučným** (ako meno). V Globálnych nastaveniach sú polia **Email a Telefón presunuté nad Sociálne siete**.

= 3.9.62 - Júl 2026 =
* 🐛 **Oprava: staré junk pole „Tweetko" definitívne odstránené zo `sameAs`.** Po premenovaní „Tweetko" → „Ostatné" (3.9.60) mohla stará hodnota osirieť v databáze a ďalej sa vypisovať v `Organization.sameAs` (napr. `tweetko.com/...`), pričom sa nedala vyhodiť cez rozhranie. Teraz sa osirený záznam pri aktualizácii natrvalo odstráni a už sa nečíta. (Ak si tam mal reálny odkaz, zadaj ho do poľa „Ostatné".)
* 🔧 **Person schéma — `worksFor` už nikdy nechýba.** Keď v poli „Pozícia/Titul" nie je uvedená firma (napr. len „CEO" bez čiarky), site-wide Person (`#person`) predtým `worksFor` nemala. Teraz sa doplní automaticky: na firemnom webe sa osoba **prepojí priamo na Organization** (`worksFor: {"@id": "…#organization"}`), takže Google vidí presné napojenie **osoba → firma**. Ak firmu v poli uvedieš (napr. „CEO, Webstudio.ltd"), použije sa tá — bez zmeny.
* 💅 Pri poli „Ostatné" (sekcia Profily) odstránený technický dovetok „Odkaz sa pridá do sameAs" — ostali len príklady.

= 3.9.61 - Júl 2026 =
* ✨ **Samostatná Person schéma na článkoch aj stránkach (popri Organization).** Ak sú v Globálne SEO vyplnené Person nastavenia (meno atď.), plugin teraz **vždy** pridá do JSON-LD `@graph` samostatnú **Person** entitu (`@id …#person`) — vedľa Organization, na článkoch, stránkach aj domovskej stránke. **Bez duplicity:** `Organization.founder` už osobu nekopíruje, len ju **referencuje cez `@id`** (jedna kanonická osoba v celom grafe). Person nesie meno, pozíciu (`jobTitle` + `worksFor`), fotku, kontakt aj `sameAs`. Weby typu „Person" ostávajú bez zmeny (jedna Person entita). Ak Person nastavenia nie sú vyplnené, nič sa nepridá.

= 3.9.60 - Júl 2026 =
* ✨ **Sekcia sameAs premenovaná na „Profily" + 3 polia „Ostatné".** V Globálne SEO → Schema sa sekcia sociálnych sietí volá teraz **„Profily (sameAs)"** — patria sem všetky odkazy, ktoré jednoznačne identifikujú firmu (sociálne siete, Google Business a ďalšie profily). Staré nezmyselné pole „Tweetko" je premenované na **„Ostatné"** a pribudli **„Ostatné 2"** a **„Ostatné 3"** — do nich dáš akýkoľvek ďalší profil, ktorý sa pridá do `sameAs` schémy Organizácie/LocalBusiness. Prípadná stará hodnota z poľa „Tweetko" sa automaticky prenesie a ostáva v `sameAs` (bez straty dát).

= 3.9.59 - Júl 2026 =
* ✨ **Person schéma — „Pozícia/Titul" sa rozdelí na `jobTitle` + `worksFor`.** Keď do poľa napíšeš napr. „CEO, Webstudio.ltd", schéma teraz vytvorí `jobTitle: "CEO"` a samostatný `worksFor` (Organization „Webstudio.ltd") namiesto toho, aby celé „CEO, Webstudio.ltd" spadlo do jobTitle. Google tak presne pochopí **kto** → **čo robí** → **kde**. Ak je názov firmy zhodný s názvom webu, doplní sa aj `url`; ak firma za čiarkou chýba, `worksFor` ostáva názov webu (ako doteraz). Platí pre site-wide Person aj autora článku.

= 3.9.58 - Júl 2026 =
* 🔧 **Obsah článku (TOC) — vodorovná čiara pri pod-položkách.** Pod-položky (H3) majú teraz krátku vodorovnú čiaru namiesto odsadenia — čisto vizuálna značka (prázdny `<span>`, žiadny text, do snippetu sa nedostane). TOC aj box „Čas čítania" ostávajú **mimo** Google snippetu (`data-nosnippet`) — Google použije skutočný meta popis, nie zoznam nadpisov. Bezpečné a predvídateľné.

= 3.9.56 - Júl 2026 =
* 🐛 **Obsah článku (TOC) sa už neťahá do Google snippetu + čistejší vzhľad.** Google si do popisu vo výsledkoch vyzobal „Obsah článku" aj s pomocnými šípkami („↳"), čo vyzeralo rozbito. Teraz má TOC aj box „Čas čítania" atribút `data-nosnippet` → Google ich do snippetu nedá a použije skutočný meta popis. Zároveň: emoji (📑, ⏱️) nahradené čistými SVG ikonkami a odstránené „↳" pri pod-položkách (H3 sú len odsadené).

= 3.9.55 - Júl 2026 =
* 🔧 **Autor box — kontakt zo samostatných globálnych polí Email/Telefón je teraz PRVÝ.** Keď email/telefón nie sú napísané priamo v poli „Sociálne siete autora", ale ťahajú sa zo samostatných globálnych polí **Email** a **Telefón**, ikonky sa teraz zobrazia **pred** sociálnymi profilmi (email, telefón, potom FB/IG…) — nie na konci. Email/telefón napísaný priamo v poli „Sociálne siete" (per-článok aj globálne) ostáva v poradí, v akom je zapísaný.

= 3.9.54 - Júl 2026 =
* 🐛 **Autor box (E-E-A-T) na frontende — dve opravy.**
* **(1) Obrázok = avatar autora, nie logo.** Box ukazoval globálny obrázok / logo webu; teraz prioritne zobrazuje **avatar skutočného autora** (gravatar alebo lokálny profilový obrázok). Globálny obrázok ostáva len ako záloha, keď autor vlastný avatar nemá. Rovnako sa správa aj `Person.image` v Schema.org.
* **(2) Poradie kontaktov v poli „Sociálne siete autora".** Email/telefón napísaný **s labelom alebo prefixom** („Tel: ", „Telefón: ", „Email: ", „E-mail: ", „mailto:", „tel:"…) sa predtým nerozpoznal, prepadol detekciou a z globálnej zálohy pristál až na konci — teraz sa rozpozná **na svojom mieste**, takže ikonky idú presne v poradí, v akom sú zapísané. (Čisto napísané kontakty bez labelu poradie držali už predtým.)

= 3.9.53 - Júl 2026 =
* 🔧 **SEO tachometer v zozname — výrazne menší a bez „/100".** Doladenie vzhľadu: budík aj číslo skóre sú teraz kompaktné (60×34 px, číslo 13 px), nech riadok zoznamu ostane nízky a prehľadný; odstránené „/100" (farebné číslo podľa zóny ostáva). Tooltip s 10 kontrolami bez zmeny.

= 3.9.51 - Júl 2026 =
* 📊 **SEO stĺpec v zoznamoch = polkruhový tachometer PRESNE ako v editore + hover tooltip.** V zozname Článkov/Stránok/Produktov sa v stĺpci SEO namiesto holého čísla zobrazuje náš tachometer — identický s tým v editore (Live SEO panel): polkruhový budík s farebnými zónami (červená/oranžová/zelená), ručičkou mieriacou na skóre, veľkým farebným číslom skóre a malým sivým „/100". Po prejdení myšou (alebo cez Tab) sa vysunie tmavý panel so všetkými 10 kontrolami — každá s fajkou (v poriadku), „!" (na zlepšenie) alebo X (chýba), plus počet „N z 10 v poriadku". Skóre je rovnaké ako doteraz, len prehľadnejšie. Bez emoji — čisté SVG ikonky.

= 3.9.47 - Júl 2026 =
* 🧹 **Odstránený prázdny stav v Schema záložke** — text „Vyberte typ Schema.org vyššie pre zobrazenie relevantných polí." (`#wseo-schema-empty-fields`) sa už nezobrazuje; keď nie je vybraný typ, sekcia je jednoducho prázdna.

= 3.9.46 - Júl 2026 =
* 💅 **Autor box na frontende — emoji nahradené SVG „verified" ikonkou, tmavšie písmo.** Namiesto 📚 (odborné témy) aj ✅ („Odborne skontroloval(a)") je teraz čistá SVG verified badge-check ikonka (zelená). Sivé texty (pozícia, kvalifikácia, bio, odborné témy, recenzent) sú tmavšie a lepšie čitateľné — bio čierne (#1a1a1a), zvyšok #333 namiesto svetlého #666.

= 3.9.45 - Júl 2026 =
* 🐛 **Import z iných SEO pluginov — doplnený prevod premenných pri SEOPress a Yoast popise.** Import (Yoast, Rank Math, SEOPress, The SEO Framework, AIOSEO) funguje inak správne — detekcia, mapovanie polí aj cieľové kľúče sedia. Chýbal len prevod dynamických premenných: **SEOPress** titulky a popisy sa importovali surové (`%%post_title%% %%sep%% %%sitetitle%%` ostalo doslovne), rovnako **Yoast popis** (titulok sa prevádzal, popis nie). Teraz sa `%%sitetitle%%`, `%%post_title%%`, `%%tagline%%`, `%%post_category%%`, `%%excerpt%%` a spol. prevedú na skutočný text pri importe. Rank Math a plain-text titulky boli v poriadku už predtým.

= 3.9.44 - Júl 2026 =
* ➕ **Polia „Hlavná téma (about)" a „Spomínané entity (mentions)" aj pre produkty.** Po správnosti: `about`/`mentions` NIE sú platné vlastnosti na `Product` (patria CreativeWork), preto sa — rovnako ako pri stránkach — pripájajú do **WebPage** schémy produktu, nie na Product uzol. Metabox ich teraz zobrazuje pre post/page/product; posty ich majú v Article, stránky a produkty vo WebPage (bez duplicity, bez neplatných vlastností).

= 3.9.43 - Júl 2026 =
* ➕ **Polia „Hlavná téma (about)" a „Spomínané entity (mentions)" aj pre stránky (page), nielen články.** Doteraz sa zobrazovali len pri príspevkoch. Na stránkach sa entity so `sameAs` pripoja do **WebPage** schémy (stránky nedostávajú Article schému). Pri príspevkoch ostáva všetko po starom (v Article), takže sa nič neduplikuje. Label „Hlavná téma článku" → neutrálne „Hlavná téma".

= 3.9.42 - Júl 2026 =
* 🔍 **Kompletný audit všetkých schema.org typov (17 typov) proti Google Rich Results — opravených 14 chýb.** Multi-agentový audit prešiel každý JSON-LD výstup; nižšie potvrdené a opravené chyby (14 z 30 nálezov; 14 bolo false-positive a zamietnutých pri overení).
* 🐛 **Event bez `location` (závažné).** Pri vyplnení len názvu + dátumu sa vygeneroval Event bez povinného `location` → Google „Missing field location". Teraz: fyzický event = `Place` s adresou (doplnená z globálnej adresy webu, min. `addressCountry`), online event = `VirtualLocation` z URL, a bez platnej lokality sa Event vôbec nevydá (lepšie než chybný).
* 🐛 **`referencePrice` (neexistuje v schema.org).** Prečiarknutá akciová cena používala neplatnú vlastnosť `referencePrice` → validátor „Unknown property". Prerobené na platný vzor `UnitPriceSpecification` s `priceType: ListPrice` (pôvodná cena), `offer.price` ostáva akciová.
* 🐛 **MerchantReturnPolicy — duplicitné `@id`.** `#return-policy` sa inline opakoval v každom variante (tá istá trieda chyby ako shippingDetails) → `@id` odstránené.
* 🐛 **LocalBusiness pobočky — neplatný `openingHours`.** Do `openingHours` sa dával slovenský voľný text („Po-Pia: 9:00-17:00"), ktorý Google odmieta. Teraz sa prijme len schema.org formát (Mo-Fr…), inak sa použije `openingHoursSpecification`.
* 🐛 **Organization podtypy dostávali neplatné geo/hours/price na pobočkách.** Multi-location logika považovala NGO, EducationalOrganization atď. za LocalBusiness. Zjednotené cez `wseo_schema_type_caps()`.
* 🐛 **VideoObject bez povinného `thumbnailUrl`** sa už nevydá (rovnako ako pri chýbajúcom contentUrl/embedUrl).
* 🐛 **ProductGroup `variesBy`** obsahoval neplatné schema.org slugy pre atribúty mimo size/color, ktoré variant nenesie → teraz len size/color (konzistentné s variantmi).
* 🐛 **JobPosting TELECOMMUTE bez `applicantLocationRequirements`** — Google to pri remote pozíciách vyžaduje; doplnené (Country z globálnej krajiny).
* 🐛 **ProfilePage `worksFor`** odkazoval `@id` na `#organization`, čo je v Person-móde webu uzol Person — nahradené inline Organization.
* 🐛 **Drobné:** nedefinovaná premenná `$org_name` v pobočke (→ `$schema_name`); `inLanguage` `sk_SK` → `sk-SK` (BCP 47); WebPage `datePublished/dateModified` na shop stránke brali dátum z nesprávneho príspevku (doplnené `$post_id`).
* ℹ️ **Neopravené (odporúčané polia, nie chyby):** Course `hasCourseInstance` a JobPosting `validThrough` — vyžadujú nové vstupné polia, sú to GSC upozornenia (warnings), nie chyby.

= 3.9.41 - Júl 2026 =
* ✨ **Nový panel „Informačný zisk (GEO / AI)" v záložke Čitateľnosť.** Meria heuristickými signálmi, či obsah prináša niečo navyše — namiesto prerozprávania konkurencie. Generatívne vyhľadávače (Google AI Overviews, ChatGPT, Perplexity) uprednostňujú a citujú obsah s vysokým informačným ziskom. Skóre 0–100 a štyri konkrétne signály: **hustota dát** (čísla, %, štatistiky), **vlastná skúsenosť** (frázy „otestovali sme / namerali sme / z našej praxe" = E-E-A-T Experience), **externé zdroje** (odkazy na štúdie/autority) a **vata** (prázdne klišé úvody). Každý signál má stav a tip. Nie je to AI generovanie — len analýza toho, čo si napísal, s nudgeom k hutnejšiemu obsahu.
* 🔧 Engine (`WSEO_Live_Analysis::information_gain`) je čisté PHP, jazykovo dvojjazyčný (SK/EN), odolný na diakritiku, kučeravé apostrofy aj neplatné UTF-8; interné odkazy sa nerátajú ako externé zdroje; rozbor sa spustí od ~100 slov.

= 3.9.40 - Júl 2026 =
* ✨ **about / mentions na článku — teraz so `sameAs` (skutočná identifikácia entít).** Dve nové polia v záložke E-E-A-T: „Hlavná téma článku (about)" a „Spomínané entity (mentions)". Formát `Názov | odkaz`, jedna entita na riadok — odkaz smeruje na Wikipédiu, Wikidata alebo oficiálnu stránku entity a vypíše sa ako Schema.org `sameAs`. Práve `sameAs` povie Googlu aj AI, o ktorú konkrétnu vec ide (že „Apple" je firma, nie ovocie) — presne to doterajšia verzia nerobila.
* 🔧 **Ručne zadané entity majú prednosť; keď sú vyplnené, doterajší šum sa nepoužije.** Predtým sa `about` bral z kategórie a `mentions` z tagov — s **internými** odkazmi na archívy (nie `sameAs`), plus `extract_content_entities()` hádzal do `mentions` ľubovoľné frázy s veľkými písmenami **bez akéhokoľvek odkazu**. Také entity nič neidentifikujú, len rozrieďujú signál. Keď teraz vyplníš ručné pole, kategórie/tagy aj regex extrakcia sa pre danú vlastnosť preskočia. Prázdne polia = pôvodné správanie zostáva (spätná kompatibilita). Rieši sa zvlášť `about` a zvlášť `mentions`.

= 3.9.39 - Júl 2026 =
* 🐛 **PetStore a ďalších 70 typov potichu strácalo telefón a adresu v Schema.org.** Dropdown ponúkal 155 typov, ale `schema_type_supports_contact` ich poznalo len 79 a `page_local_types` (GPS) len 11 — takže ClothingStore, Florist, JewelryStore, Hospital, PetStore… vyplnenú adresu/telefón/GPS v JSON-LD zahodili (Google to hlásil ako „Chýbajúce pole"). Nahradené jedným zdrojom pravdy `wseo_schema_type_caps()` (prebraté z v4). Person = len kontakt, Organization = adresa+kontakt, LocalBusiness a podtypy = adresa+kontakt+GPS+hodiny+cena, civilné (nemocnica, knižnica…) bez ceny. Odteraz sa pri zmene typov mení len tento jeden zdroj.
* 🐛 **Duplicitná Organization na homepage.** Na statickej titulnej stránke sa vypisovala Organization dvakrát s tým istým `@id #organization` — raz plná (z globálnych nastavení, správny názov firmy), raz „page-level" (s názvom stránky namiesto názvu firmy). Google hlásil „Duplicate field name". Page-level schéma sa už na homepage nevypisuje — tam hlavnú entitu pokrýva site-wide Organization/Person.
* 🔧 **Poistka proti duplicitným uzlom v @graph.** `flush_schema_buffer()` teraz zlúči uzly s rovnakým `@id` (bohatší vyhráva, chýbajúce vlastnosti sa doplnia, nič sa neprepíše). Zabráni to opakovaniu tejto triedy chýb pri akejkoľvek inej kombinácii typov.
* 🐛 **Merchant Listings — duplicitné `deliveryTime` a `shippingRate`.** Pri variabilnom produkte každý variant vkladal `shippingDetails` s rovnakým `@id #shipping-policy`, takže Google videl tú istú entitu N-krát. `@id` odstránené — inline objekt dopravy je platný aj bez neho.
* 🐛 **Merchant Listings — chýbajúce `size` na variantoch.** ProductGroup deklaroval `variesBy: size`, ale varianty samotnú hodnotu nenesli. Každý variant teraz vypíše svoju `size` / `color` (rozpozná Veľkosť/Rozmer/Size a Farba/Color, taxonomické atribúty preloží na čitateľný názov).
* 🐛 **Merchant Listings — chýbajúce `description`.** Popis produktu má teraz zálohu: krátky popis → dlhý popis → SEO meta popis → názov produktu, takže nikdy nechýba.

= 3.9.38 - Júl 2026 =
* ➕ **Kontakt v autor boxe sa doplní z globálnych nastavení, ak nie je v poli.** Ak v poli „Sociálne siete autora" nie je email, vezme sa **Email** z globálnych nastavení (Predvolené údaje autora, hneď pod „Odborné témy"); to isté platí pre **Telefón**. Pole má vždy prednosť — čo napíšeš na článok, to platí, a nič sa nezduplikuje. Rieši sa to zvlášť pre email a zvlášť pre telefón, takže môžeš mať v poli len jedno a druhé nechať na globál. Doplnené ikonky idú na koniec riadku.
* 🔧 Globálne hodnoty prechádzajú tou istou kontrolou ako pole: email cez `is_email()`, telefón cez detekciu čísla, a obom sa najprv zjednotia medzery. Nezmyselná hodnota v globálnom poli teda ikonku nevyrobí. Do Schema.org kontakt nejde ani takto — `sameAs` obsahuje výhradne odkazy na profily.

= 3.9.37 - Júl 2026 =
* 🐛 **Telefón v poli „Sociálne siete autora" sa mohol ticho zahodiť.** Čísla skopírované z webu, Wordu alebo z kontaktov často nemajú obyčajnú medzeru, ale nezalomiteľnú (U+00A0) či úzku (U+202F) — na obrazovke vyzerajú úplne rovnako, ale detekcia telefónu ich nepoznala a riadok prepadol bez akejkoľvek stopy. Riadky sa teraz pred vyhodnotením normalizujú (exotické medzery na obyčajnú, neviditeľné znaky preč), takže na spôsobe kopírovania už nezáleží.

= 3.9.36 - Júl 2026 =
* ✨ **Email a telefón sa píšu priamo do poľa „Sociálne siete autora".** Pole berie jeden záznam na riadok a samo rozozná, čo je čo: `karol@webstudio.ltd` → ikonka obálky (`mailto:`), `+421 900 123 456` alebo `(02) 123 456 78` → ikonka slúchadla (`tel:`), odkaz → ikonka siete. Ikonky sa vypíšu v poradí, v akom sú v poli. Keďže pole je per-článok a dedí z globálnych nastavení, kontakt sa nastavuje tam, kde patrí — bez ďalších polí a bez prepínača.
* 🔧 **Do `Person.sameAs` idú naďalej LEN odkazy na profily.** Email ani telefón sa do schémy nedostanú — `sameAs` je zoznam profilov, čokoľvek iné by tam bola neplatná hodnota. Filter je nasadený na všetkých **štyroch** miestach, kde pole tečie do schémy: site-wide Person entita, `Organization.founder`, autor článku a autorská archívna stránka. Nerozpoznaný riadok sa preskočí (predtým išiel do `sameAs` tak, ako bol).
* 🐛 **Opravené `sameAs` ako JSON objekt namiesto poľa** pri `Organization.founder` a na autorskej archívnej stránke. Obom chýbalo `array_values()`, takže prázdny riadok uprostred poľa rozbil číslovanie kľúčov a JSON-LD vypísal objekt s číselnými kľúčmi namiesto poľa. Rovnaká chyba, aká sa v 3.9.28 opravila pri autorovi — tieto dve miesta sa vtedy vynechali.
* 🧹 **Reťaz pádov pre pole („post meta → globálne → WP profil") presunutá do `resolve_author_social_text()`** a používa ju schéma aj autor box — nemôžu sa teda rozísť.
* ↩️ **Zrušené z 3.9.35:** prepínač „Kontakt autora v článkoch" a `Person.email` / `Person.telephone` na autorovi článku. Kontakt sa rieši cez pole vyššie; globálne nastavenia (Email, Telefón) fungujú ďalej tak ako predtým — plnia site-wide Person entitu a `Organization.founder`.

= 3.9.35 - Júl 2026 =
* ➕ **Email a telefón autora v E-E-A-T schéme aj v autor boxe.** Polia „Email" a „Telefón" v globálnych nastaveniach existovali už dávno a išli do site-wide Person entity aj do `Organization.founder`, ale `build_author_schema()` ich ignorovalo — ten istý človek mal na homepage kontakt a na článku nie. Teraz sa `Person.email` a `Person.telephone` pridajú aj k autorovi článku a v boxe pribudnú ikonky `mailto:` a `tel:` (obálka a slúchadlo, pred profilmi — kontakt je priama akcia, nie odkaz na profil).
* 🔒 **Riadi to nový prepínač „Kontakt autora v článkoch" (Globálne nastavenia → Predvolené údaje autora), predvolene VYPNUTÝ.** Dôvod: `wseo_default_person_*` je **jeden** globálny človek, takže na webe s viacerými autormi by sa jeho kontakt prilepil ku každému z nich a schéma by tvrdila nepravdu. S vypnutým prepínačom sa nemení vôbec nič — ani schéma, ani box. Jeden prepínač riadi oboje naraz, aby sa box a schéma nikdy nerozišli.
* 🔧 Email prejde cez `is_email()` v boxe **aj** v schéme (neplatná hodnota sa nevypíše nikde), telefón sa pre `tel:` odkaz očistí na číslice a `+`. Odkazy majú `rel="nofollow noopener noreferrer"`; `mailto:`/`tel:` zámerne bez `target="_blank"`.
* ℹ️ **Poznámka k SERP:** Google autorský email ani telefón v snippete nezobrazuje — žiadny rich result to nerobí. Ide o konzistenciu entity a o kontakt pre čitateľa, nie o zmenu vzhľadu vo vyhľadávaní.

= 3.9.34 - Júl 2026 =
* 💅 **Autor box — pozícia a kvalifikácia na samostatných riadkoch.** Predtým sa `jobTitle` a `hasCredential` spájali pomlčkou do jedného riadku („CEO, Webstudio.ltd — SEO Konzultant"), čo splývalo. Teraz je pozícia na jednom riadku, kvalifikácia pod ňou a bio až pod tým. Sú to dve rôzne Schema.org vlastnosti, takže aj vizuálne patria na dva riadky.

= 3.9.33 - Júl 2026 =
* 🐛 **Sociálne ikonky v autor boxe boli pri prejdení myšou nečitateľné.** Box sa vkladá do `the_content`, takže ikonky sedia v obsahu témy — a téma si na odkazy v obsahu vynúti vlastnú farbu. Pozadie ikonky sa prefarbilo na brand farbu, ale glyf ostal v farbe témy a na tmavom pozadí zanikol (rovnako boli aj nehoverované ikonky farebné namiesto sivých). Pravidlá teraz používajú vyššiu špecificitu (`.wseo-author-box .wseo-abox-social a`) a `!important` na farbu, pozadie, orámovanie a podčiarknutie. Overené proti štyrom variantom tém vrátane takej, ktorá tlačí `color` cez `!important`, aj proti ID selektorom.

= 3.9.32 - Júl 2026 =
* ✨ **Záložka „Rozšírené" premenovaná na „E-E-A-T".** Nová ikonka (autor namiesto kľúča) a opravený popisok pri prejdení myšou — starý tvrdil „Breadcrumbs, vlastné Schema.org značky a ďalšie nastavenia", čo v tej záložke nie je ani jedno. Nový: „Autor, odborná kontrola obsahu, AI označenie, hreflang a čas čítania". Obsah záložky ani `data-tab="advanced"` sa nemenili.
* ➕ **Sociálne siete v autor boxe.** Odkazy z poľa „Sociálne siete autora" (Person.sameAs) sa teraz vypisujú aj ako ikonky priamo v autor boxe na stránke — doteraz žili len v neviditeľnom JSON-LD. Rozpoznáva LinkedIn, X, Facebook, Instagram, YouTube, TikTok, GitHub, Pinterest, Threads, Telegram a Mastodon podľa domény odkazu; nerozpoznaný odkaz dostane ikonku webu, takže nechýba nikdy. Ikonky sú sivé a brand farbu ukážu až pri prejdení myšou. Odkazy sú `target="_blank"` + `rel="nofollow noopener noreferrer"` a vykresľujú sa nad blokom „Odborne skontroloval(a)", ktorý patrí inému človeku.
* 🐛 **Globálne E-E-A-T údaje sa konečne dedia na články.** Pole „Meno autora" v metaboxe bolo predvyplnené **hodnotou** z WordPress profilu, ktorá sa pri každom uložení článku zapísala do `_wseo_author_name`. Tým sa v `build_author_schema()` vždy trafila Priorita 1 (post meta) a globálne „Predvolené údaje autora/zakladateľa" sa na článok nikdy nedostali. Pole je teraz prázdne a meno z profilu je len placeholder.
* ➕ **Metabox ukazuje, čo sa zdedí.** Pod každým prázdnym E-E-A-T poľom (meno, pozícia, URL, sociálne siete, kvalifikácia, odborné témy) pribudla poznámka „✓ Použije sa z globálnych nastavení: …" s odkazom na ich úpravu, plus globálna hodnota ako placeholder. Prázdne pole = článok dedí globál, čokoľvek napíšeš = override pre daný článok. Poznámka zámerne používa ten istý zelený „✓" štýl, aký plugin už má pri metadátach obrázka — žiadny nový komponent.
* 🔧 **Migrácia pri aktualizácii** vyčistí auto-vyplnené `_wseo_author_name`, aby staré články začali dediť globálne údaje. Maže len hodnoty presne zhodné s `display_name` autora (tie zapísal starý formulár), ručne napísané mená ostávajú. Poistka: beží len na webe s jediným autorom a len keď je globálne meno vyplnené — na viacautorských weboch by inak globálne meno prevzalo autorstvo cudzích článkov.

= 3.9.31 - Júl 2026 =
* 🔧 **Schema JSON-LD Preview presunutý do záložky „Schema".** Predtým bol box umiestnený MIMO tab panelov, takže sa zobrazoval v **každej** záložke. Teraz je správne vnútri Schema záložky.
* ➕ **Schema panel dostupný aj pre články (post), nielen stránky (page).** Panel `wseo-tab-schema` sa teraz vykresľuje pre všetky typy obsahu — pri článkoch ukáže JSON-LD náhľad (predtým bola celá Schema záložka prázdna pre post, preto bol náhľad vyňatý von a „presakoval" do ostatných záložiek).

= 3.9.30 - Júl 2026 =
* 🐛 **wp_unslash() dokončené v CELOM plugine** — v 3.9.29 bol fix len vo `save_meta_boxes()`. Teraz je `wp_unslash()` konzistentne aj na ~180 ďalších miestach ukladania: **globálne nastavenia** (názov firmy, slogan, adresa, AI texty „čo robíme", sociálne siete, hotel/reštaurácia polia), **Quick Edit**, **Redirect Manager**, **SEO pre kategórie/produkty** a AJAX handlery. Text s apostrofom alebo úvodzovkou (napr. „We're #1", O'Brien) sa už nikde neuloží so spätným lomítkom. Nízke bezpečnostné riziko (sanitizácia bežala aj predtým) — ide o dátovú konzistenciu.

= 3.9.29 - Júl 2026 =
* 🐛 **wp_unslash() dokončené v `save_meta_boxes()`** — v 3.9.24 bol fix len na 4 poliach (meta titulok/popis/kľúčové slovo, robots pravidlá). Teraz je `wp_unslash()` konzistentne na všetkých ~40 poliach metaboxu (author, recipe, event, service, software, image credit, page schema, hreflang, otváracie hodiny) — apostrofy a úvodzovky sa už nikde neuložia so spätným lomítkom.
* ➕ **E-E-A-T: `hasCredential` a `knowsAbout`** — nové polia v metaboxe (Kvalifikácia autora, Odborné témy) aj v globálnych nastaveniach (predvolené hodnoty). `build_author_schema()` ich pridáva do Person schémy — dôležité pre YMYL obsah (zdravie, financie, právo), kde Google raters hľadajú dôvod, prečo je autor kvalifikovaný.
* ➕ **E-E-A-T: `reviewedBy`** — nová sekcia „Odborná kontrola obsahu" v metaboxe (meno, titul, URL, dátum kontrolóra). Article/BlogPosting schéma teraz môže deklarovať, kto obsah odborne skontroloval.
* ➕ **Viditeľný autor box na stránke** — nová funkcia `output_author_bio_box()` vypisuje pod obsahom článku viditeľný box s autorom (foto, meno, pozícia, kvalifikácia, bio, odborné témy, prípadne kto obsah recenzoval). Rieši riziko, že E-E-A-T údaje boli doteraz len v neviditeľnom JSON-LD — Google raters aj čitatelia hodnotia to, čo vidno na stránke. Zapína/vypína sa per-článok (predvolene zapnuté pre príspevky).

= 3.9.28 - Júl 2026 =
* 🧹 **Zjednotená author (Person) schéma** — duplicitná E-E-A-T author logika medzi WebPage a Article schémou (2× rovnaký ~100-riadkový blok) zjednotená do jednej metódy `build_author_schema()`. Odstránené riziko, že sa údaje o autorovi časom rozídu medzi WebPage a Article na tej istej stránke. Bonus: `sameAs` sa teraz vždy vypíše ako platné JSON pole (predtým pri prázdnych social odkazoch mohlo vzniknúť JSON-objekt namiesto poľa).

= 3.9.27 - Júl 2026 =
* 🐛 **Review badge — odstránené natvrdo 5★.** `shortcode_review_badge` (`[wseo_review_badge]`) vypisoval 5 hviezdičiek bez ohľadu na reálne Google hodnotenie = zavádzajúci trust signál. Teraz sa hviezdy ukážu LEN ak je reálne hodnotenie vyplnené v nastaveniach (`wseo_schema_rating_value`), inak žiadne. (Shortcode je aj tak zatiaľ neregistrovaný/zakomentovaný — ide o preventívnu opravu latentného kódu.)

= 3.9.26 - Júl 2026 =
* 🔒 **BEZPEČNOSTNÝ RELEASE — zavreté diery z bezpečnostného auditu:**
* 🛑 **Auto-update RCE (kritické):** endpoint `/remote-update` prijme `download_url` len z webstudio.ltd (HTTPS) a overí balík (zip + voliteľný SHA-256) PRED zmazaním priečinka; odstránený zabudnutý upgrade krok. (V rade 4.0.x bolo od 4.0.1, teraz aj v rade 3.9.x.)
* 🛑 **Verejný SQL backup + diagnostika (kritické):** zálohy a diagnostické reporty sa už NEpíšu do verejného `/uploads`. Teraz do chráneného adresára (`uploads/wseo-private` s `.htaccess`/`web.config` deny + `index.php`) s náhodným názvom; stiahnutie len cez autentifikovaný handler (oprávnenie + nonce), súbor sa po stiahnutí zmaže. Predtým bola celá DB (vrátane hesiel a licenčného kľúča/secretu) verejne stiahnuteľná.
* 🔑 **/force-update:** `secret` sa overuje konštantným `hash_equals` (predtým len či nie je prázdny) + `download_url` allowlist.
* ↪️ **Open redirect (Redirect Manager):** regex/wildcard pravidlá už nedovolia, aby vstup z URL zmenil cieľ presmerovania na cudziu doménu (admin-konfigurovaný cieľ ostáva).
* 🛡️ **CSRF:** `ajax_send_test_push` dostal nonce.

= 3.9.25 - Júl 2026 =
* 🐛 **Oprava počítania slov (slovenčina):** frontendový „Čas čítania" widget aj Article schema `wordCount` počítali cez `str_word_count()`, ktorý slovenské slová s diakritikou (á/č/š/ž/ť…) rozsekal na kúsky a **nafukoval počet** (napr. reálnych 2992 slov hlásil ako ~4086). Teraz sa počíta UTF-8 metódou rovnako ako v editore → reálny čas čítania a **správny wordCount do Googlu**.

= 3.9.24 - Júl 2026 =
* 🔧 **Person schema v dropdowne** presunutá do skupiny „Základné" (predtým samostatná skupina „Osoba").
* 🧹 **Interné premenovanie** funkcie `ajax_submit_sitemap_to_gsc` → `ajax_submit_sitemap_to_search_engines` — posiela ping na IndexNow/Bing/Yandex/Seznam (nie Google; Google svoj ping endpoint zrušil 2023), pôvodný názov bol zavádzajúci. UI aj AJAX action string zachované (nič sa nerozbije).
* 🐛 **wp_unslash() konzistentne** pri ukladaní — meta titulok/popis/kľúčové slovo a `wseo_robots_custom_rules`. WordPress pridáva pred `$_POST` spätné lomítka, takže apostrofy/úvodzovky (napr. „O'Brien") sa už neuložia so spätným lomítkom.

= 3.9.23 - Júl 2026 =
* 🐛 **Oprava meta titulku na článkoch:** názov webu (napr. „ - Webstudio") sa už NEzapieka priamo do uloženej hodnoty poľa. Predtým sa pri prázdnom poli auto-generovaný titulok uložil ako „test - Webstudio", takže v editore bolo v poli „test - Webstudio" a k tomu ešte sivý prívesok „-Webstudio" (zdvojené). Teraz sa ukladá **čistý** titulok („test"), názov webu sa pridáva až vo výstupe `<title>` a v editore ho naďalej ukazuje sivý prívesok napravo — presne ako má byť.
* ℹ️ Pri už uložených článkoch, kde je názov webu zapečený v poli: vymažte pole meta titulku a uložte (auto-vygeneruje sa čistý), alebo prepíšte na vlastný text.

= 3.9.22 - Júl 2026 =
* 👤 **Person schema — web môže reprezentovať osobu** (osobná značka, jednotlivec, freelancer), nie len firmu. V Globálnych nastaveniach je „Typ entity" s možnosťou 👤 Osoba ako prvou.
* ✅ Pri type Osoba sa vypíše plnohodnotná **Person** entita (meno, fotka, jobTitle, email, telefón, adresa, sociálne siete = sameAs) z globálnych Person údajov. Zachované @id (#organization) → referencie v grafe (WebSite.publisher, autor) ostávajú platné.
* ✅ **UX:** pri voľbe Osoba sa skryjú firemné polia (Logo, Obrázok firmy) a zobrazí navádzač na sekciu Person údajov.
* ✅ Person pridaná aj do zoznamu typov pre per-page schému.

= 3.9.21 - Júl 2026 =
* 🐛 **Oprava Google Indexing API (Service Account JSON):** pri ukladaní JSON credentials chýbalo `wp_unslash()`, takže WordPress do JSON pridal spätné lomítka (`"` → `\"`, `\n` → `\\n`) a uložil sa poškodený JSON → test pripojenia hlásil „Neplatný formát JSON credentials". Teraz sa JSON ukladá správne (`trim(wp_unslash(...))`). Po aktualizácii treba JSON znova vložiť a uložiť.

= 3.9.20 - Júl 2026 =
* 🤖 **Prepis llms.txt na správny štandard ([llmstxt.org](https://llmstxt.org/)):** generátor `/llms.txt` teraz vytvára **spec-compliant** výstup — `# Názov`, `> zhrnutie`, krátky prozaický popis a sekcie `## Hlavné stránky` / `## Články` / `## Produkty` ako **zoznam odkazov `- [Názov](url): popis`** (predtým `### Nadpis` + `- URL:`, čo nie sú odkazy a striktné AI parsery ich nevytiahli). Sekundárne odkazy (Sitemap/RSS/soc. siete) sú v `## Optional`.
* 🧹 Odstránené neštandardné veci: sekcia „Povinné citovanie", emoji v nadpisoch, key-value „O firme" bordel a meniaci sa timestamp (súbor bol pri každom načítaní iný).
* 🛡️ **Poistka proti server erroru:** `serve_llms_txt()` je obalený v `try/catch` a vždy vráti platný `200` s aspoň `# Názov` — nikdy `500`. (Google Lighthouse „agentic browsing" audit flaguje llms.txt, ktorý vracia server error; čistý 404 alebo 200 je v poriadku.)
* ℹ️ Pozn.: Google **Search / AI Overviews llms.txt nepoužíva** (potvrdené Googlom) — súbor slúži pre AI agentov/nástroje, ktoré ho čítajú, a pre Lighthouse audit. `X-Robots-Tag: noindex` ostáva.
* 🔑 **Licenčný box:** pridaný riadok „Verzia pluginu" (pod Status) — vidno, ktorá verzia beží.

= 3.9.19 - Júl 2026 =
* 🧩 **Revízia štruktúrovaných dát pre Služby / Profesionálne služby / Lokálne podniky** (audit voči Google a schema.org):
* 🐛 **Type-safe kontakt a adresa:** telefón, e-mail a adresa (`PostalAddress`) sa už pridávajú **len na typy, ktoré ich naozaj podporujú** (Organization/Lokálny podnik a podtypy). Predtým sa lepili na akýkoľvek typ (Service, Článok, Podujatie, Stránka…), kde sú neplatné.
* 🐛 **Cena „0" už nevzniká sama:** pri **Službe** sa `offers` (ponuka) pridá **iba keď zadáš reálnu cenu** — koniec zavádzajúceho signálu „zadarmo" s cenou 0 €, keď cena nebola vyplnená.
* 🐛 **`priceValidUntil` len pri platenej cene:** pri Službe, Software aj Kurze sa dátum platnosti ceny už nenastavuje na bezplatné (0 €) ponuky (nezmysel „táto zadarmo služba o rok zdražie"). Bezplatné aplikácie/kurzy naďalej korektne majú `price: "0"` (Google to tak vyžaduje pre rich results).
* 🔗 **Prepojenie entít (@id):** `provider`/`seller` pri Službe a Software teraz odkazujú na hlavnú firemnú entitu (`#organization`) namiesto vytvárania duplicitnej, neprepojenej firmy v grafe. Page-schéma dostala vlastné `@id`.
* 🌍 **Presnejšie `areaServed`:** odstránené chybné pravidlo „čokoľvek do 3 znakov = krajina" (mestá ako „Spa"/„Pau" sa už neoznačia ako štát) a „eu" sa už neberie ako krajina.
* 📐 **`serviceType` vždy text** (schema.org `Text`) — už nie raz text, raz pole.
* 🛡️ **Zabránené dvojité vypálenie:** ak má stránka zvolený firemný typ schémy, nevytvorí sa navyše samostatná Service entita (dve konkurenčné firmy na jednej URL).
* ℹ️ **ProfessionalService** navádza zvoliť konkrétny podtyp (Advokát/Notár/Účtovník…) tam, kde sedí. Poznámka v kóde: `aggregateRating` na `Service` je platné, ale Google preň nezobrazuje hviezdičky (na recenzie slúži Lokálny podnik).

= 3.9.18 - Júl 2026 =
* 🥖 **Veľká revízia breadcrumbs (omrvinky) — opravy + nové funkcie na úrovni Yoast/RankMath/SEOPress:**
* 🐛 **Oprava dátumových archívov:** breadcrumb na archívoch podľa dátumu bral zlý/prázdny dátum (z aktuálneho príspevku v slučke) → rozbité názvy a neplatné `@id` URL typu `/blog//#breadcrumb`. Teraz sa berie z dopytu (rok/mesiac/deň) správne.
* 🐛 **Oprava neplatných odkazov v Schema:** ak `get_term_link()` zlyhal (zmazaný/chybný termín), mohol sa do JSON-LD dostať chybný objekt. Pridaná poistka, ktorá každú neplatnú položku vyhodí — do Google ide vždy čistý `BreadcrumbList`.
* ♿ **Prístupnosť (a11y):** aktuálna položka má vždy `aria-current="page"` (aj pri tučnom zvýraznení) a dekoratívny oddeľovač `›` je skrytý pred čítačkami (`aria-hidden`) — už ho nečíta ako „greater-than".
* 🧩 **Nový Gutenberg blok „Breadcrumbs (Webstudio SEO)"** — vloženie breadcrumbu priamo v editore, s náhľadom a nastavením oddeľovača/textu domov/ikony.
* 👨‍💻 **Template funkcia pre témy:** `wseo_the_breadcrumbs()` / `wseo_get_breadcrumbs()` — breadcrumb sa dá vypísať priamo v šablóne bez shortcode.
* ⚙️ **Nové nastavenia breadcrumbs:** vypínač JSON-LD schémy (proti duplicite s témou/iným pluginom), voľba oddeľovača (aj HTML entity), predpona (prefix), a možnosť schovať/zobraziť breadcrumb na domovskej stránke. Predvolene sa jednopoložkový breadcrumb na úvodnej stránke potláča (ako to robia Yoast/RankMath/SEOPress).
* 🌐 **RTL podpora** vizuálneho breadcrumbu (smer + logické okraje).
* 🧱 **Vlastné typy obsahu (CPT):** breadcrumb teraz dopĺňa aj rodičovské stránky (hierarchické CPT) a hlavnú kategóriu z vlastnej taxonómie (nehierarchické CPT) — nielen archív a aktuálnu položku.

= 3.9.17 - Júl 2026 =
* 📖 **Zjednotená čitateľnosť medzi Live SEO panelom a záložkou „Čitateľnosť":** obe teraz ukazujú **to isté číslo** (kompozitné skóre 0–100), počítané jednou kanonickou funkciou v engine (`WSEO_Live_Analysis::readability_from()`) podľa rovnakých váh (Flesch + dĺžka viet + dlhé vety + prechodové slová + trpný rod − opakovania + variabilita začiatkov). Predtým Live panel ukazoval čistý Flesch a záložka kompozit → mätúce rozdielne čísla na tom istom článku.
  * Záložka sa navyše **synchronizuje so živým editorom** (slová/vety/čas čítania/skóre v hlavičke sa aktualizujú počas písania), takže obe strany čítajú ten istý obsah. Čas čítania zjednotený na celé minúty.
  * Iba čítanie, žiadny vplyv na SERP.

= 3.9.16 - Júl 2026 =
* 🏷️ **Service Schema „Typ služby" podľa Google:** voľné textové pole nahradené **vyhľadávacím výberom z ~4000 oficiálnych kategórií Google Business Profile** — vyberieš jednu alebo viac presne podľa Google (žiadne vymyslené kategórie). Výstup do JSON-LD ako pole (viac) alebo text (jedna).
* 💅 Schema záložka: nadpisy sekcií FAQ a Recept/Podujatie zjednotené do rovnakého štýlu ako Service/Software (predtým ľahko prehliadnuteľné).

= 3.9.15 - Júl 2026 =
* 🧹 **llms.txt bez emoji:** generovaný `/llms.txt` už neobsahuje emoji v nadpisoch sekcií ani prenesené z titulkov/popisov (čistý strojovo-čitateľný výstup pre AI boty). Šípky (→) ostávajú zachované.
* 🗂️ **Konsolidácia Schema záložky:** samostatný meta-box „Recept & Podujatie" a samostatná záložka „FAQ" presunuté **priamo do záložky „Schema"** — všetko štruktúrované dáta na jednom mieste.
* 💅 Oprava „dvojitej čiary" pod nadpismi sekcií v editore.

= 3.9.14 - Júl 2026 =
* 🐛 Oprava zobrazenia na stránke Globálne SEO — chýbajúci `<script>` spôsoboval, že sa časť JavaScriptu vypisovala ako text.

= 3.9.13 - Júl 2026 =
* 🎯 **Zjednotenie čísel medzi „Live SEO skóre" a záložkami dole:** hustota kľúčového slova, počet slov/viet, Flesch a čas čítania sa teraz počítajú **jedným enginom** (`WSEO_Live_Analysis`) — koniec rozdielov medzi horným panelom a záložkami. Opravené slovenské skloňovanie v hustote (predtým `str_word_count`/`stripos` rátali diakritiku zle).

= 3.9.12 - Júl 2026 =
* ✂️ Odstránený text „Dáta z GSC meškajú ~2–3 dni." z GSC widgetu (na želanie).

= 3.9.11 - Júl 2026 =
* 🔤 Premenované „Živé SEO skóre" → „SEO skóre" v editore.

= 3.9.10 - Júl 2026 =
* 🔤 Oprava kódovania v GSC widgete (rozbité pomlčky „–" a „…" v texte obdobia).

= 3.9.9 - Júl 2026 =
* 🔒 **GSC bezpečnosť/súkromie:** plugin teraz **automaticky priradí len property tohto webu** namiesto ponúkania všetkých domén z pripojeného účtu. Predtým mohol klient v svojom WP vidieť všetky domény agentúry (viac klientov v jednom Google účte) — opravené. Property sa neberie z formulára (žiadne podstrčenie cudzej domény), len auto-match podľa domény webu.
* 🩺 GSC: zobrazenie presnej Google chyby pri pripojení + jasnejšia hláška pri access_denied (Testing mód → pridať test usera/publikovať appku).

= 3.9.8 - Júl 2026 =
* 🤖 **Automatický režim render-blocking (ako WP Rocket/Elementor):** async VŠETKY CSS + **automatické generovanie Critical CSS** (above-the-fold) per typ šablóny (homepage/článok/stránka/archív) pri prezeraní webu ako admin → rýchlo bez blikania. Critical CSS sa pri zapnutí auto režimu automaticky aktivuje. Keep-blocking safelist pre výnimky.
  * Generátor beží len pre admina, raz na typ šablóny (časový budget + strop pravidiel proti zamrznutiu). CSS-aware sanitizácia (blokuje @import/expression/javascript:/behavior) proti stored XSS.

= 3.9.7 - Júl 2026 =
* 🚀 **Eliminovať render-blocking (Performance):** nová sekcia v Globálnych nastaveniach — asynchrónne načítanie vybraných CSS (media=print + onload + noscript) a defer vybraných JS, aby neblokovali prvé vykreslenie (rýchlejšie LCP/FCP, bez bieleho flashu). List-based (deferuje sa len to, čo vypíšeš), default VYPNUTÉ, guardy (safe-mode/admin/login/builder), voliteľný defer jQuery. Analytics/tracking sa async/defer automaticky.

= 3.9.6 - Júl 2026 =
* 💅 Live SEO panel: skryté body (+N) pri jednotlivých kontrolách — ostáva len ikona stavu, text a „?“ tooltip. Celkové skóre (X/100) ostáva v hlavičke.

= 3.9.5 - Júl 2026 =
* 💅 Live SEO panel: zoznam kontrol rozdelený do **dvoch stĺpcov** (kompaktnejšie), s responzívnym fallbackom na jeden stĺpec pri úzkom paneli.

= 3.9.4 - Júl 2026 =
* ⚡ **Live SEO nahradilo záložku „Audit":** celý SEO audit (100 bodov / 14 kontrol) je teraz **živý** v paneli navrchu meta-boxu — aktualizuje sa počas písania, s presnými hláškami („Titulok je príliš krátky (7 znakov, odporúčané 30-60)"), **bodmi (+N)** pri každej kontrole a **„?" tooltipmi** s vysvetlením. Skóre sa zobrazuje ako body (X/100).
  * Statická záložka „Audit" bola zrušená (jej info je teraz živé). Záložka „Čitateľnosť" ostáva ako podrobný rozbor.
  * Engine `WSEO_Live_Analysis` prepísaný na verný port audit kontrol (titulok, popis, keyword v titulku/popise, hustota, dĺžka obsahu, nadpisy, obrázky+alt, interné odkazy, náhľadový obrázok, URL slug). Slovenské skloňovaniu-odolné vyhľadávanie keywordu.
  * Iba čítanie, žiadny vplyv na SERP.

= 3.9.3 - Júl 2026 =
* 🔍 **Google Search Console integrácia (OAuth):** pripojenie cez vlastnú Google Cloud OAuth aplikáciu (Client ID/Secret) → reálne **kliky, impresie, priemerná pozícia a CTR** za 28 dní + top dopyty priamo v dashboarde. Nová sekcia „Search Console" v Globálnych nastaveniach (pripojiť/vybrať property/odpojiť) + widget na dashboarde.
  * Izolovaný modul `WSEO_GSC` (core/class-wseo-gsc.php) — OAuth authorization-code + refresh token, `searchAnalytics.query`, cache 3 h.
  * Read-only (scope `webmasters.readonly`), nemení nič na frontende → **žiadny vplyv na SERP**. CSRF ochrana (nonce + OAuth state), admin-only.

= 3.9.2 - Júl 2026 =
* ⚡ **Živé SEO skóre v editore (real-time content analysis):** nový panel navrchu meta-boxu, ktorý sa aktualizuje **počas písania** (Gutenberg aj Classic editor) — celkové SEO skóre + kontroly: kľúčové slovo v titulku/popise/úvode, hustota, dĺžka titulku/popisu, dĺžka obsahu, štruktúra nadpisov, čitateľnosť (Flesch), trpný rod, dlhé vety. Slovenské skloňovaniu-odolné vyhľadávanie kľúčového slova (nájde „realitná kancelária" aj v „realitnú kanceláriu").
  * Nový izolovaný engine `WSEO_Live_Analysis` (core/class-wseo-live-analysis.php) — čisté, testovateľné jadro.
  * Iba čítanie (nič sa neukladá), nemení frontend → **žiadny vplyv na SERP**.
  * Podrobný statický rozbor v záložkách Audit/Čitateľnosť ostáva nezmenený (po uložení).

= 3.9.1 - Júl 2026 =
* 🧹 **Údržba a súlad (WordPress best-practice):**
  * Pridaný `uninstall.php` — pri odinštalovaní pluginu sa upracú vlastné `wseo_*` options, transienty, naplánované cron úlohy aj tabuľka opustených košíkov. Per-článok SEO meta (`_wseo_*`) sa **zachová**, kým to výslovne nepovolíš cez `wseo_delete_data_on_uninstall` (ochrana obsahu).
  * `Tested up to` aktualizované na 6.8.
  * Zjednotená licencia — `Proprietary` v readme aj v hlavičke pluginu (predtým protichodné GPLv2 vs Proprietary).

= 3.9.0 - Jún 2026 =
* 🏷️ **Kompletné Schema.org LocalBusiness typy** podľa Google noriem (148 podtypov — auto-moto, financie vrátane banky/bankomatu, zdravotníctvo, obchody, stravovanie, nemocnica/hasiči/polícia/pošta…); odstránený neplatný typ FoodService.
* 🎯 **Schema correctness audit (Google Rich Results):**
  * VacationRental/Lodging: `occupancy` vždy prítomné, `geo` + `address` aj v `containsPlace`, `identifier` ako platný Text.
  * Organization: logo zbavené nepodporovaných polí (creditText/license/creator…), ktoré Google hlásil ako warning.
  * Product (variabilný): variant obrázky v absolútnej URL.
  * VideoObject: fallback `thumbnailUrl`, vynútené `contentUrl`/`embedUrl`.
  * JobPosting: podpora `jobLocationType` (remote) + fallback.
* 🍽️ **Recept (Recipe) a Podujatie (Event) schéma — nový meta-box** „Recept & Podujatie": ingrediencie, postup, časy (ISO 8601), kalórie, dátumy, miesto, vstupenky. Predtým neaktívne, teraz plne funkčné + Google-compliant.

= 3.8.2 - Jún 2026 =
* 🎯 **SERP correctness audit fixes — odstránenie protichodných signálov pre Google**
* ✅ Sitemap: jeden zdroj pravdy pre indexovateľnosť — vylúčené noindex / heslom chránené / cudzo-canonicalizované URL (vrátane news a image sitemapu)
* ✅ Product schema: `offers` sa generujú vždy (aj free/0 cena a bez ceny), obrázok s fallbackom + absolútna URL (simple aj variabilné produkty) → product rich results
* ✅ Article/Page schema: obrázky vždy v absolútnej URL (Google odmietal relatívne)
* ✅ og:url teraz vždy zodpovedá canonicalu (singular, taxonómie, autor, homepage — vrátane stránkovania)
* ✅ Title: detekcia názvu firmy len na konci reťazca (koniec falošného „Pro" v „Professional")
* ✅ og:image rozmery z reálnych metadát prílohy (namiesto natvrdo 1200×630)
* ✅ Redirecty pri odstránení base: validácia celej hierarchickej cesty, wp_safe_redirect, zachovanie query stringu
* ✅ Kolízie slugov: krížová detekcia medzi taxonómiami
* ✅ robots.txt: zrušené blokovanie tracking parametrov (nech canonical konsoliduje)
* ✅ JSON-LD: `JSON_HEX_TAG` — obsah s „</script>" už nerozbije schému
* ✅ Last-Modified/304: priorita po redirectoch, odstránené tiché potlačenie chýb

= 2.6.0 - Január 2026 =
* 🏆 **MAJOR RELEASE: Centrálne globálne nastavenia pre Person!**
* 🔥 **NEW: Sekcia "Predvolené údaje autora/zakladateľa" v Globálnych nastaveniach**
* ✅ Meno, Fotka, Pozícia, URL, Sociálne siete - vyplní sa raz
* ✅ Organization.founder používa centrálne nastavenia
* ✅ WebPage.author používa centrálne nastavenia  
* ✅ Article.author používa centrálne nastavenia
* 🎯 **Priorita: Post meta → Centrálne nastavenia → WordPress profil**
* 🏆 **Vyplní sa raz v admin paneli → použije sa všade! 100% garantované!**

= 2.4.5 - Január 2026 =
* ✅ **Automatické vyplnenie všetkých odporúčaných polí z WordPress dát**
* ✅ ImageObject.name - z ALT textu obrázka
* ✅ ImageObject.description - z Caption/Description obrázka
* ✅ ImageObject.author - z creator (automaticky)
* ✅ Person.image - WordPress avatar autora
* ✅ Person.worksFor - Organization (názov webu)
* 🎯 **0 chýb v Google Search Console pre ImageObject a Person**
* 🚀 Žiadna manuálna práca - všetko automatické!

= 2.4.4 - Január 2026 =
* ✅ Pridané povinné polia pre ImageObject schema (Search Console)
* ✅ Pridané pole "creditText" (autor/zdroj obrázka)
* ✅ Pridané pole "license" (URL licencie)
* ✅ Pridané pole "acquireLicensePage" (stránka s licenciou)
* ✅ Pridané nepovinné pole "creator" (tvorca obrázka)
* ✅ Pridané nepovinné pole "copyrightNotice" (copyright oznámenie)
* ✅ Globálne nastavenia pre logo metadata
* ✅ Individuálne nastavenia pre featured images
* ✅ **Automatické predvyplnenie polí z globálnych nastavení**
* 🔧 Oprava 5 chýb z Google Search Console

= 2.0.0 =
* Kompletne prepracované rozhranie
* Tabová navigácia (Všeobecné, Sociálne, Viditeľnosť)
* Vylepšené progress bary
* Náhľad pre sociálne siete
* Noindex/Nofollow nastavenia
* Canonical URL podpora
