Skip to content

Releases: MarcinZmuda/Ligase-Schema-Markup

Ligase 2.4.29

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 24 Jul 12:22
ebd9e79

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

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 08 Jul 13:36
74bd827

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

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 08 Jul 13:18
96fd597

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

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 08 Jul 13:00
2885cfc

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

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 08 Jul 12:44
1be08c0

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,9924.99); CollectionPage na home; render bloków FAQ/HowTo; szkielet shippingDetails; Recipe ISO-8601; daty Course/VideoObject.

WooCommerce

  • AggregateOffer dla produktów wariantowych (lowPrice/highPrice z 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)

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 10 Jun 19:57

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_array

Detection 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

  1. Pobierz ZIP powyżej
  2. WP Admin → Wtyczki → Dodaj nową → Wyślij wtyczkę → ZIP → Zastąp obecnym
  3. Standalone_mode musi być ON (już masz)
  4. Wyczyść cache (LiteSpeed / Cloudflare)
  5. Rich Results Test → /produkt/koldra-metis/ → 0 krytycznych errors

Ligase 2.4.23 — docs sanitization + README/CHANGELOG sync

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 07 Jun 15:17

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

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 06 Jun 18:34

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-10K ale 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%)

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 03 Jun 12:20

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_as textarea — Spotify / Apple Podcasts / YouTube, jeden URL na linię (esc_url_raw per linia)
  • feed_urlwebFeed property (Apple Podcasts directory)
  • language BCP-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 / SubscribeAction
  • LikeAction / 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)

Choose a tag to compare

@MarcinZmuda MarcinZmuda released this 03 Jun 12:06

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 @id ref 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_affiliation textarea: Nazwa | URL
  • Schema rozróżnia memberOf (formalne członkostwo) od affiliation (luźne współprace / advisory). Wcześniej wszystko leciało do memberOf
  • Przykład: jesteś radcą prawnym (memberOf KIRP), ale współpracujesz z fundacją Court Watch (affiliation)

3. subjectOf (repeater)

  • ligase_subject_of textarea: Tytuł | URL
  • Cross-link do zewnętrznych artykułów / wywiadów / podsumowań konferencyjnych gdzie autor jest TEMATEM (nie autorem)
  • Emitowane jako Article nodes
  • Bardzo silny sygnał Knowledge Graph: "ta encja jest opisywana przez te niezależne publikacje" = autorytet

4. workExperience (repeater)

  • ligase_work_experience textarea: 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_award textarea: jeden per linia
  • Plain string: Diamenty Forbesa 2023
  • Lub strukturalny: Nazwa | Wydawca | rok → output Nazwa (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