feat(seo): add district landing pages for long-tail discovery#26
Merged
Conversation
base.json now carries the ETL run timestamp so downstream consumers (e.g. sitemap lastModified, landing page freshness line) can reflect the actual data generation time instead of request time.
Introduce 368 statically-rendered landing pages under /tw/[city-slug]/[district-slug]/, each listing the district's road translations and 3+3 zip segments with a one-sentence machine summary and BreadcrumbList JSON-LD. Motivation: the single-page SPA surfaces no content for long-tail queries like "信義區郵遞區號" or "板橋區 英文". Pre-rendering per district gives search engines and LLM crawlers extractable, verifiable facts per URL. - add toSlug() utility for URL slugs derived from English names - expand sitemap from 1 entry to ~369 with ETL-timestamp lastModified - explicitly allow GPTBot, Google-Extended, PerplexityBot, ClaudeBot in robots (disallow /data/ asset dir)
- address-form: after city+district are chosen, show a link into the matching /tw/[city]/[district] landing page so users can reach the per-district road and zip segment reference. - address-page: on mount, read ?city= and ?district= slugs and hydrate the reducer, so the landing-page CTA "go query this district" lands the user on the home form with the selection already applied.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/tw/[city-slug]/[district-slug]/, each listing road translations and 3+3 zip segments with a machine-generated summary and BreadcrumbList JSON-LD — so long-tail queries like "信義區郵遞區號" or "板橋區 英文" now have an extractable landing surface.generatedAt), and explicitly allow GPTBot / Google-Extended / PerplexityBot / ClaudeBot inrobots.tswhile keeping/data/disallowed.?city=&district=back to home so the form hydrates with the selection.Test plan
pnpm checkpasses (typecheck + lint + prettier)pnpm buildrenders all 368 district pages as Static (●), no Dynamic (ƒ) routes introduced/tw/taipei-city/xinyi-dist/,/tw/new-taipei-city/banqiao-dist/,/tw/kaohsiung-city/zuoying-dist/): page renders, metadata / canonical / JSON-LD correct/sitemap.xmllists ~369 URLs/robots.txtcontains GPTBot / Google-Extended / PerplexityBot / ClaudeBot entries