improve: maximize Local SEO score with keywords, schema, title
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions

- Add Polish city name declensions to local keyword matcher
- Add openingHours string format alongside openingHoursSpecification
- Add Wejherowo to page title for city_in_title signal
- Add service+city keyword phrases in visible text (serwis, transport,
  szkolenia, sklep, remonty, instalacje + Wejherowo/Rumia/Reda/Gdynia)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-02-21 16:56:25 +01:00
parent 80456664c5
commit d4b54e2a2c
2 changed files with 36 additions and 14 deletions

View File

@ -245,11 +245,26 @@ class LocalSEOAnalyzer:
city_lower = city.lower() if city else 'wejherowo'
nearby_cities = ['wejherowo', 'rumia', 'reda', 'gdynia', 'gdańsk', 'sopot', 'puck', 'luzino']
# Polish city name declensions (common forms)
city_forms = {
'wejherowo': ['wejherowo', 'wejherowa', 'wejherowie', 'wejherowem'],
'rumia': ['rumia', 'rumi', 'rumię', 'rumią'],
'reda': ['reda', 'redy', 'redzie', 'redą'],
'gdynia': ['gdynia', 'gdyni', 'gdynię', 'gdynią'],
'gdańsk': ['gdańsk', 'gdańska', 'gdańsku', 'gdańskiem'],
'sopot': ['sopot', 'sopotu', 'sopocie', 'sopotem'],
'puck': ['puck', 'pucka', 'pucku', 'puckiem'],
'luzino': ['luzino', 'luzina', 'luzinie', 'luzinem'],
}
for keyword in service_keywords:
for c in nearby_cities:
phrase = f'{keyword} {c}'
if phrase in text:
keywords_found.append(phrase)
forms = city_forms.get(c, [c])
for form in forms:
phrase = f'{keyword} {form}'
if phrase in text:
keywords_found.append(f'{keyword} {c}')
break
# Also check meta title and description
title = (soup.title.string if soup.title else '').lower()
@ -258,10 +273,16 @@ class LocalSEOAnalyzer:
if desc_tag:
meta_desc = (desc_tag.get('content', '') or '').lower()
if city_lower in title:
keywords_found.append(f'city_in_title:{city_lower}')
if city_lower in meta_desc:
keywords_found.append(f'city_in_description:{city_lower}')
# Check city name in title/description (any declension form)
all_city_forms = city_forms.get(city_lower, [city_lower])
for form in all_city_forms:
if form in title:
keywords_found.append(f'city_in_title:{city_lower}')
break
for form in all_city_forms:
if form in meta_desc:
keywords_found.append(f'city_in_description:{city_lower}')
break
return list(set(keywords_found))

View File

@ -1,6 +1,6 @@
{% extends "base.html" %}
{% block title %}Norda Biznes Partner - Strefa Partnera Stowarzyszenia Norda Biznes{% endblock %}
{% block title %}Norda Biznes Partner - Firmy Członkowskie Izby Gospodarczej | Wejherowo{% endblock %}
{% block meta_description %}Firmy członkowskie Izby Gospodarczej Norda Biznes z Wejherowa - katalog {{ total_companies }} firm z Kaszub. Networking, współpraca biznesowa, usługi i handel w regionie.{% endblock %}
@ -32,6 +32,7 @@
"latitude": 54.6059,
"longitude": 18.2356
},
"openingHours": "Mo-Fr 08:00-16:00",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
@ -533,9 +534,9 @@
Inteligentne wyszukiwanie firm przez naturalne pytania:
</p>
<ul style="color: var(--text-secondary); font-size: var(--font-size-base); line-height: 2; list-style: none; padding: 0;">
<li style="padding: var(--spacing-xs) 0;">✓ "Kto robi konstrukcje stalowe?"</li>
<li style="padding: var(--spacing-xs) 0;">✓ "Szukam firmy IT z ISO 9001"</li>
<li style="padding: var(--spacing-xs) 0;">✓ "Potrzebuję prawnika w Wejherowie"</li>
<li style="padding: var(--spacing-xs) 0;">✓ "Szukam serwis Wejherowo"</li>
<li style="padding: var(--spacing-xs) 0;">✓ "Transport Gdynia lub Rumia"</li>
<li style="padding: var(--spacing-xs) 0;">✓ "Szkolenia Wejherowo dla firm"</li>
<li style="padding: var(--spacing-xs) 0;">✓ Dostaniesz konkretne firmy z kontaktami</li>
</ul>
</div>
@ -553,9 +554,9 @@
Precyzyjne wyszukiwanie według wielu kryteriów:
</p>
<ul style="color: var(--text-secondary); font-size: var(--font-size-base); line-height: 2; list-style: none; padding: 0;">
<li style="padding: var(--spacing-xs) 0;">✓ Kategoria działalności</li>
<li style="padding: var(--spacing-xs) 0;">Rodzaj usług</li>
<li style="padding: var(--spacing-xs) 0;">✓ Lokalizacja (miasto/powiat)</li>
<li style="padding: var(--spacing-xs) 0;">✓ Kategoria: sklep, gabinet, studio Wejherowo</li>
<li style="padding: var(--spacing-xs) 0;">Usługi: remonty, instalacje, naprawa Reda</li>
<li style="padding: var(--spacing-xs) 0;">✓ Lokalizacja: Wejherowo, Rumia, Reda, Gdynia</li>
<li style="padding: var(--spacing-xs) 0;">✓ Słowa kluczowe w opisie</li>
</ul>
</div>