feat: page registry with its admin screen and signpost type

- golem15_seo_pages (migration 202610280002): the site's own frontend pages
  with an address and a name per locale, kind, origin, parent, content date
  and note; settings routes_reported_at
- SEO > Pages (golem15.seo.pages) after URL rules: list with kind, origin
  and missing filters and the missing row state, form with the P9 partial;
  the plugin's form extension saves the address and name per locale and
  refuses url_required, url_invalid, url_taken and url_owned
- menu item type seo-page with a content descriptor, so each page gets
  the SEO tab, resolves ok and is listed in the sitemaps grouped by kind
  (pages, offers, services, landing-pages, titled per locale)
- management API GET/POST /_seo/api/v1/pages, PUT/DELETE /pages/{id} and
  the MCP tools seo_list_pages, seo_create_page, seo_update_page,
  seo_delete_page (in this commit because the operations parity test maps
  every Pages operation to its tool)
This commit is contained in:
Jakub Zych
2026-11-04 13:20:45 +01:00
parent 17b810dfde
commit 9e802ec850
27 changed files with 2281 additions and 9 deletions

View File

@@ -2,6 +2,7 @@ plugin:
name: SEO
description: Metadane dla wyszukiwarek we wszystkich typach treści, reguły adresów i globalne ustawienia SEO.
nav:
pages: Strony
robots: robots.txt
notfound: Dziennik 404
redirects: Przekierowania
@@ -175,6 +176,7 @@ history:
what_robots: robots.txt
what_settings: Ustawienia SEO
what_notfound: Wpis dziennika 404 „:url”
what_page: Strona „:url”
change_cell:
one: ':field: :before → :after'
few: Zmieniono :count pola
@@ -208,6 +210,7 @@ history:
kind_robots: robots.txt
kind_settings: Ustawienia SEO
kind_notfound: Wpis dziennika 404
kind_page: strona rejestru
jobs:
generate_entries: 'SEO: generowanie wpisów'
effective:
@@ -358,3 +361,48 @@ transfer:
row_canonical: "Adres kanoniczny przekierowuje na „:target”"
row_rule: "Pod tym adresem nie ma rekordu: zostanie utworzona reguła adresu"
row_invalid: ":field: :message"
pages:
type: Strona witryny
list_title: Strony
name: Strona
new: Nowa strona
list_empty: Nie ma jeszcze stron. Dodaj tu własne strony witryny, np. stronę główną, kontakt lub strony ofertowe, aby miały zakładkę SEO i miejsce w mapach witryny. Witryna może też zgłaszać swoje strony automatycznie.
url: Adres
title: Nazwa
kind: Typ
origin: Pochodzenie
content_updated: Zmiana treści
reported: Ostatnie zgłoszenie
kind_page: Strona
kind_offer: Oferta
kind_service: Usługa
kind_landing: Landing page
origin_manual: Ręcznie
origin_reported: Zgłoszona przez witrynę
origin_mcp: MCP
state_missing: Brak w witrynie
filter_missing: Brak w witrynie
filter_missing_only: Tylko brakujące
filter_missing_hide: Ukryj brakujące
url_comment: Ścieżka strony w każdym języku, np. /kontakt. Zostaw język pusty, jeśli strona nie ma w nim wersji.
title_comment: Używana w domyślnym tytule SEO, mapie HTML i ścieżce nawigacji.
kind_comment: "Decyduje o pliku mapy witryny i domyślnych danych strukturalnych: oferty i usługi stają się typem Service."
parent: Strona nadrzędna
parent_none: Brak (najwyższy poziom)
parent_comment: Umieszcza stronę pod inną w ścieżce nawigacji.
content_updated_comment: Wysyłana jako lastmod w mapach witryny. Zmień ją, gdy treść strony zmieni się w witrynie.
note: Notatka
note_comment: Nie jest wyświetlana na stronie.
status_reported: Zgłoszona przez witrynę :time.
status_missing: Ostatnie zgłoszenie witryny (:time) nie zawierało tego adresu. Sprawdź, czy strona nadal istnieje, a potem usuń ją tutaj lub ustaw przekierowanie.
url_required: Wpisz adres w języku domyślnym.
url_invalid: Zacznij adres od / i pomiń domenę.
url_taken: Inna strona już używa tego adresu.
url_owned: "Ten adres należy do: :type „:title”. Ustaw jego SEO tam."
parent_loop: Strony nie można umieścić pod nią samą ani pod jej podstroną.
delete_confirm: Usunąć tę stronę z rejestru? Jej zakładka SEO zostanie usunięta, a adres zniknie z map witryny. Strona zgłaszana przez witrynę wróci przy następnym zgłoszeniu.
delete_selected_confirm:
one: "Usunąć :count stronę z rejestru? Jej zakładka SEO zostanie usunięta."
few: "Usunąć :count strony z rejestru? Ich zakładki SEO zostaną usunięte."
many: "Usunąć :count stron z rejestru? Ich zakładki SEO zostaną usunięte."
other: "Usunąć :count strony z rejestru? Ich zakładki SEO zostaną usunięte."