Releases: MarcinZmuda/Ligase-Schema-Markup
Release list
Ligase 2.4.29
KRYTYCZNE: 11 typów schema było po cichu blokowanych na STRONACH.
FAQPage, HowTo, Course, Event, Review, QAPage, DefinedTerm, ClaimReview, SoftwareApplication, AudioObject i VideoObject sprawdzały kontekst przez is_single(), które jest prawdziwe tylko dla wpisów. Na stronie (page) zwraca false → włączałeś przełącznik, wypełniałeś pola, a schema nigdy się nie emitowała, bez żadnego komunikatu.
Generator celowo wywołuje te typy w kontekście strony (jego komentarz wprost wymienia Service / Event / FAQ / HowTo / Course jako opt-in per strona) - czyli intencja i bramka w typie były sprzeczne. Nowsze typy (Product, Recipe, JobPosting, Forum, PodcastSeries) miały już poprawne is_singular(); starsze zostały na is_single().
Naprawione:
- 11 typów
is_single()→is_singular()(wpisy + strony + CPT) - Service miał ograniczenie odwrotne (
is_page()blokowało wpisy/CPT) → teżis_singular() - BlogPosting celowo zostaje na
is_single()(strony dostają WebPage)
Jeśli masz strony z włączonym FAQ/HowTo/Course, które nie pokazywały schemy - po tej aktualizacji zaczną działać bez żadnych zmian w treści.
Zweryfikowane na żywej stronie WP: is_page=true, is_single=false, is_singular=true → FAQPage, Course i Service pojawiają się w grafie.
Ligase 2.4.28
Course UI + czystszy graf Organization.
Course (szkolenia/kursy)
Nowa sekcja "Course — szkolenie / kurs" w meta-boxie wpisu (po włączeniu toggle Course): name, description, courseMode (Online/Onsite/Blended), teaches. hasCourseInstance.startDate bierze automatycznie datę modyfikacji strony (evergreen). Wcześniej Course miał tylko przełącznik, bez pól do wpisania danych.
Organization — koniec wiszących employee
employee[] (do 20 kont WP jako @id #author-N) było wiszącymi referencjami do niematerializowanych węzłów Person (a w trybie "Organizacja jako autor" — zawsze). Property nie daje rich resultu w Google → usunięta. founder zostaje i jest teraz materializowany (referencja się rozwiązuje); graf deduplikowany po @id.
Instalacja: strony z 2.4.26+ dostaną przycisk "Zaktualizuj teraz" automatycznie. Ręcznie: ligase-2.4.28.zip → Wtyczki → Dodaj nową → Wyślij wtyczkę.
Ligase 2.4.27
Doprecyzowanie: token GitHub jest OPCJONALNY. Repo Ligase jest publiczne, więc auto-update z 2.4.26 działa bez tokena i bez żadnej konfiguracji — przycisk "Zaktualizuj teraz" pojawia się sam. (W 2.4.26 opis błędnie sugerował, że token jest wymagany.)
LIGASE_GH_TOKEN pozostaje jako opcja tylko do podniesienia limitu API GitHuba (60 → 5000/h) — istotne dopiero gdy wiele stron odpytuje z tego samego IP.
Bez zmian funkcjonalnych względem 2.4.26. Instalacja: ligase-2.4.27.zip → Wtyczki → Dodaj nową → Wyślij wtyczkę.
Ligase 2.4.26
Automatyczne aktualizacje. Od tej wersji Ligase pokazuje standardowy przycisk "Zaktualizuj teraz" w panelu WordPress, gdy wyjdzie nowszy release - jak zwykła wtyczka. Kolejnych wersji nie trzeba już wgrywać ręcznie.
Konfiguracja (jednorazowo na stronę)
Repo jest prywatne, więc wklej read-only token GitHub do wp-config.php:
define( 'LIGASE_GH_TOKEN', 'github_pat_...' );Token: fine-grained PAT, uprawnienie Contents: read, ograniczony tylko do repo Ligase. Bez stałej wtyczka działa normalnie, tylko nie widzi aktualizacji.
Instalacja tej wersji
Pobierz ligase-2.4.26.zip → Wtyczki → Dodaj nową → Wyślij wtyczkę. Zawiera wszystkie poprawki z 2.4.25 + mechanizm auto-update.
Ligase 2.4.25
Najnowsza wersja ze wszystkimi poprawkami. Instalacja: pobierz ligase-2.4.25.zip poniżej → Wtyczki → Dodaj nową → Wyślij wtyczkę.
Bezpieczeństwo
- Klucz API NER szyfrowany w bazie (AES-256-CBC); rotowane logi niepobieralne na Nginx.
Krytyczne / martwe funkcje
- NER fatal na PCRE2 < 10.43; audytor ślepy na Yoast/Rank Math; reguły (pusty id); sync_block_meta kasujący FAQ/HowTo; import kasujący klucz NER; GSC rich-results HTTP 400; strona Narzędzia (osierocone submenu); auto-naprawa na nieistniejącym meta.
Schema na froncie
- Ceny z przecinkiem (
24,99→24.99); CollectionPage na home; render bloków FAQ/HowTo; szkielet shippingDetails; Recipe ISO-8601; daty Course/VideoObject.
WooCommerce
- AggregateOffer dla produktów wariantowych (
lowPrice/highPricez realnego zakresu wariantów) — usuwa niezgodność ceny w Merchant Listings.
Pełne noty: readme.txt / CHANGELOG.md.
Ligase 2.4.24 — Suppressor: WooCommerce core JSON-LD (Product duplicate brand fix)
Krytyczny fix dla sklepów WooCommerce w standalone_mode.
Problem (diagnosed live na makumi.eu)
Rich Results Test dla produktu wariantowego /produkt/koldra-metis/ zgłaszał:
- ❌ Zduplikowane pole "brand" (krytyczny) — Ligase emit "MAKUMI Sp. z o.o" + WooCommerce core emit "Makumi" w osobnych blokach JSON-LD
- ⚠ Nieprawidłowy typ obiektu w polu offers (niekrytyczny) — Ligase Offer vs WC AggregateOffer dla produktu z wariantami
Przyczyna
WooCommerce od wersji 7.2 emituje własne JSON-LD @graph bezpośrednio przez wp_footer — niezależnie od jakiegokolwiek pluginu SEO. Ligase Suppressor wyciszał dotychczas 7 pluginów SEO (Yoast / RankMath / AIOSEO / SEOPress / TSF / Slim SEO / The Events Calendar), ale WooCommerce core nie był na liście — bo to nie jest "plugin SEO".
Fix
Nowy wpis woocommerce_core w Ligase_Suppressor::KNOWN_PLUGINS z 4 filter hooks:
woocommerce_structured_data_product → __return_empty_array
woocommerce_structured_data_review → __return_empty_array
woocommerce_structured_data_breadcrumblist → __return_empty_array
woocommerce_structured_data_website → __return_empty_arrayDetection przez WC_VERSION constant + WooCommerce class. Aktywne tylko gdy standalone_mode ON.
Plus output-buffer scrubber (od 2.4.13) dodatkowo wycina nawet pusty fragment [] który WC może wyrenderować.
Po wgraniu na sklep WC + standalone_mode
- ✅ 0 błędów krytycznych w Rich Results Test
- ✅ Tylko jeden blok JSON-LD na stronie produktu (Ligase)
- ✅ Czysta Offer struktura (zero AggregateOffer collision)
- ✅ Brand z prawidłową nazwą (z Ligase ustawień, nie WooCommerce fallback)
Download
https://github.com/MarcinZmuda/Ligase-Schema-Markup/releases/download/v2.4.24/ligase-2.4.24.zip
Krok po kroku dla makumi.eu
- Pobierz ZIP powyżej
- WP Admin → Wtyczki → Dodaj nową → Wyślij wtyczkę → ZIP → Zastąp obecnym
- Standalone_mode musi być ON (już masz)
- Wyczyść cache (LiteSpeed / Cloudflare)
- Rich Results Test →
/produkt/koldra-metis/→ 0 krytycznych errors
Ligase 2.4.23 — docs sanitization + README/CHANGELOG sync
Cleanup: client-specific examples replaced with neutral ones (Redakcja MAKUMI → Redakcja/Zespół, Kancelaria Rafał Styczyński → Twoja Firma Sp. z o.o., makumi.eu → generic WooCommerce). README.md synced from 2.3.2 to 2.4.22 with all new features. CHANGELOG.md gets [2.4.22] entry with full 2.4.8-22 history. CONTRIBUTING.md Polish diacritics restored. No functional changes — pure documentation/hint sanitization.
Ligase 2.4.20 — Google open-web schema popularity stats: UI badges + coverage doc
Wbudowuje dane z Google open-web crawl (schemaorg/schemaorg/data/public_stats/google/2026_05.csv, snapshot maj 2026) jako stały dataset w pluginie + dodaje UI badges + publikuje pełny raport coverage.
1. Ligase_Popularity_Stats (nowy class)
Static map każdy typ schemy → bucket popularności:
- Tier 1
10M+: BreadcrumbList, Person, Organization, WebPage, WebSite, ImageObject, ListItem (8 types Ligase emituje) - Tier 2
1M-10M: Article, Product, Service, FAQPage, LocalBusiness, Review, VideoObject, ItemList... (17 types) - Tier 3
100K-1M: Event, JobPosting, HowTo, ProfilePage, InteractionCounter, MerchantReturnPolicy... (18 types) - Tier 4
10K-100K: Recipe, Course, PodcastSeries, QAPage, DiscussionForumPosting, AudioObject (6 types — niszowe) - Tier 5
1K-10K: ClaimReview (1 type)
API:
Ligase_Popularity_Stats::bucket( 'FAQPage' ); // "1M-10M"
Ligase_Popularity_Stats::tier( 'PodcastSeries' ); // 4
Ligase_Popularity_Stats::badge_html( 'Event' ); // <span ...>100K-1M ustabilizowane</span>2. UI: Badge w meta-boxie
W każdym poście (Edit screen) → Ligase meta-box:
- Obok dropdownu "Typ schematu" — badge z bucket'em wybranego typu
- Obok każdego enable checkbox (FAQ, HowTo, Event, Product, PodcastSeries itd.) — badge tego typu
Kolory:
- 🟢 zielony = tier 1-2 (powszechne, bezpieczne)
- 🔵 niebieski = tier 3 (ustabilizowane)
- 🟡 żółty = tier 4-5 (niszowe, świadoma decyzja)
- 🔴 czerwony = eksperymentalne (
<1K)
Tooltip nad badge'em pokazuje liczbę domen + datę snapshot'a.
3. Doc: pełny coverage raport
docs/google-stats-coverage-2026-05.md — pełen breakdown Ligase coverage vs Google open-web. Identyfikuje konkretne luki i daje data-driven roadmap:
2.5.0 News/YMYL Pack:
- NewsMediaOrganization (
1K-10Kale ważne dla wydawców) - Organization identifier KRS/NIP/REGON
- Trust Project 8 polityk
2.5.1 — top-2 gaps:
- AggregateOffer (
1M-10M, dla price ranges) - OfferCatalog (
100K-1M, dla Organization.makesOffer) - UnitPriceSpecification
2.5.2 — LocalBusiness depth:
- Corporation, GeoCircle, LocationFeatureSpecification
4. Walidacja decyzji 2.4.19
PodcastSeries (tier 4) + InteractionCounter (tier 3) + subjectOf (tier 3) — wszystkie w established / niche-but-real bucketach. Decyzje uzasadnione.
Download
https://github.com/MarcinZmuda/Ligase-Schema-Markup/releases/download/v2.4.20/ligase-2.4.20.zip
Ligase 2.4.19 — PodcastSeries type + Person.agentInteractionStatistic (plan marcinzmuda.com 100%)
Domyka plan personal-brand SEO do 100% pokrycia w UI.
1. PodcastSeries (nowy typ schemy)
Klasa Ligase_Type_PodcastSeries emituje PodcastSeries dla strony-huba podcastu (np. /update-time-by-marcin-zmuda/).
Włączanie: per-page checkbox _ligase_enable_podcast_series w Ligase meta-box. Plus dane w "Pola zaawansowane → PodcastSeries":
name(puste = tytuł strony)description(puste = excerpt)image(puste = featured image)same_astextarea — Spotify / Apple Podcasts / YouTube, jeden URL na linię (esc_url_raw per linia)feed_url→webFeedproperty (Apple Podcasts directory)languageBCP-47 (default site locale)number_of_episodes(optional)
Author routes przez BlogPosting::author_ref_id() (respektuje org_author_mode + ligase_is_redakcja). Publisher → site Organization.
2. agentInteractionStatistic (Person AI/LLM signal)
Nowe pole user profile ligase_agent_stats — textarea repeater interactionType | count | platform.
Emituje InteractionCounter nodes pod Person.agentInteractionStatistic. Whitelisted actions:
WatchAction(YouTube views)ListenAction(Spotify plays)ReadAction(Medium reads)FollowAction/SubscribeActionLikeAction/ShareAction/CommentAction/InteractAction
WAŻNE: liczby muszą być publicznie weryfikowalne. Wymyślone = manual action za structured-data spam.
Przykład dla marcinzmuda.com
User Profile → Ligase Person → agentInteractionStatistic:
SubscribeAction | 5000 | YouTube
ListenAction | 150000 | Spotify
FollowAction | 12000 | LinkedIn
Page /update-time-by-marcin-zmuda/ → meta-box:
☑ PodcastSeries (strona-hub podcastu)
Pola zaawansowane → PodcastSeries:
Nazwa: Update Time by Marcin Żmuda
Opis: Co dwa tygodnie omawiam najnowsze wydarzenia ze świata SEO
sameAs:
https://open.spotify.com/show/0OWj5mceMLpAsWeVjCe6PX
https://www.youtube.com/@marcin_zmuda_seo
https://podcasters.spotify.com/pod/show/marcin-zmuda
Język: pl-PL
Stan po 2.4.19
Plan personal-brand SEO dla marcinzmuda.com w 100% pokryty w UI Ligase (bez apply_filters workaroundów):
| P0/P1/P2/P3 z planu | Pokrycie |
|---|---|
| Person (name, jobTitle, image, description, sameAs) | ✅ |
| givenName/familyName/honorificPrefix | ✅ |
| knowsAbout, knowsLanguage | ✅ |
| alumniOf, memberOf (repeater) | ✅ |
| hasCredential (repeater) | ✅ |
| worksFor external (2.4.18) | ✅ |
| affiliation, subjectOf, workExperience, award (2.4.18) | ✅ |
| agentInteractionStatistic (2.4.19) | ✅ |
| Organization/ProfessionalService | ✅ (lb_type dropdown) |
| ProfilePage na /o-mnie/ | ✅ |
| WebSite + BreadcrumbList | ✅ |
| Service per oferta | ✅ |
| Event past speaking | ✅ |
| PodcastSeries (2.4.19) | ✅ |
| BlogPosting na blogu | ✅ |
Download
https://github.com/MarcinZmuda/ligase-Schema-Markup/releases/download/v2.4.19/ligase-2.4.19.zip
Ligase 2.4.18 — Person: 5 nowych pól E-E-A-T (worksFor external + affiliation + subjectOf + workExperience + award)
Rozszerzenie Person schema dla personal-brand / expert SEO. Pola wcześniej dostępne tylko przez apply_filters('ligase_person') — teraz w UI User → Profile → Ligase Person.
5 nowych pól
1. worksFor external
ligase_works_for_name+ligase_works_for_url- Twoja własna firma / kancelaria zamiast forced
@idref do Organization tej strony - Idealne dla ekspertów piszących na cudzym portalu (infor.pl, sąsiednia branża) którzy prowadzą własną działalność
- Puste → fallback do site Organization (jak wcześniej)
2. affiliation (repeater)
ligase_affiliationtextarea:Nazwa | URL- Schema rozróżnia
memberOf(formalne członkostwo) odaffiliation(luźne współprace / advisory). Wcześniej wszystko leciało do memberOf - Przykład: jesteś radcą prawnym (
memberOfKIRP), ale współpracujesz z fundacją Court Watch (affiliation)
3. subjectOf (repeater)
ligase_subject_oftextarea:Tytuł | URL- Cross-link do zewnętrznych artykułów / wywiadów / podsumowań konferencyjnych gdzie autor jest TEMATEM (nie autorem)
- Emitowane jako
Articlenodes - Bardzo silny sygnał Knowledge Graph: "ta encja jest opisywana przez te niezależne publikacje" = autorytet
4. workExperience (repeater)
ligase_work_experiencetextarea:Stanowisko | Firma | URL firmy | rok od | rok do- Strukturalna historia kariery jako
OrganizationRole+ nested Organization - Bardziej ekspresyjne niż single jobTitle dla osobistej marki
- Walidacja dat: YYYY albo YYYY-MM-DD
5. award
ligase_awardtextarea: jeden per linia- Plain string:
Diamenty Forbesa 2023 - Lub strukturalny:
Nazwa | Wydawca | rok→ outputNazwa (Wydawca, rok) - Google akceptuje string-or-object; używamy text dla SERP cleanliness
Backward compat
Wszystkie pola opcjonalne. Person renderuje się identycznie jak w 2.4.17 gdy są puste. Brak migracji bazy. Url tokens w pipe-separated polach automatycznie sanitized przez esc_url_raw() (drop javascript: / data: / vbscript:).
Przykład dla marcinzmuda.com (twoja sytuacja z poprzedniej rozmowy)
User → Profile → Ligase Person:
worksFor — nazwa: Embasy
worksFor — URL: https://embasy.pl
affiliation:
Stowarzyszenie SEO Polska | https://seopolska.org
subjectOf:
Prelegenci semKRK i semWAW podsumowują 2024 | https://devagroup.pl/blog/prelegenci-semkrk
Co zmieni się w SEO 2025 — opinie ekspertów | https://blog.majestic.com/pl/seo-2025
workExperience:
Founder & Owner | Embasy | https://embasy.pl | 2014 |
Head of Internet Marketing | Orion Media Group | | 2014 | 2018
Webmaster | Emart Synergia | | 2007 | 2014
award:
Diamenty Forbesa 2023
Profesjonalista Roku | Festiwal SEO | 2024
Download
https://github.com/MarcinZmuda/Ligase-Schema-Markup/releases/download/v2.4.18/ligase-2.4.18.zip