Example: local services
A roofing company works in twenty towns and offers three services: general roofing, roof repair and gutter cleaning. People search for exactly that combination (roof repair Lyon), so the company wants a page for every town, and a page for every service in every town:
/roofer-lyon/,/roofer-grenoble/, … — one page per town/roofer-lyon/roof-repair/,/roofer-lyon/gutter-cleaning/, … — one page per service per town
That is 60 pages, but the towns are typed in only once. This example uses one parent template with a row per town, and two child templates that reuse those rows.
The parent template: one page per town
Section titled “The parent template: one page per town”Properties
Section titled “Properties”| Property | Type | Code | Example value |
|---|---|---|---|
| Title | Title | title |
Roofer in Lyon |
| URL | URL / Slug | href |
lyon |
| Town | Text field | town |
Lyon |
| Introduction | Textarea | intro |
Two paragraphs about the company’s work in Lyon: the historic centre, typical tiled roofs, recent projects. |
| Area | Text field | area |
Lyon, Villeurbanne and Bron |
| Phone | Phone (Pro) | phone |
+33 4 12 34 56 78 |
| Contact email | email |
lyon@example.com | |
| Neighbourhoods | Item list (Pro) | districts |
Croix-Rousse, Confluence, Part-Dieu, … one per line |
| Town photo | Thumbnail (Pro) | photo |
a photo of a recent job in Lyon |
The Introduction is what makes each page worth visiting: write it per town, with local details. Don’t settle for a sentence that only swaps the town name.
Title and address
Section titled “Title and address”- Template title:
@code_title_210@ - Href on the General tab:
/roofer-@code_href_210@
With the URL value lyon, the page lives at /roofer-lyon/.
The page, section by section
Section titled “The page, section by section”- Hero: the town photo as background or next to the heading, an H1 Your roofer in Lyon, a line Working in Lyon, Villeurbanne and Bron and a Call us button.
- Introduction: the town’s own text.
- Services: three cards linking to the service pages for this town.
- Neighbourhoods: We work in these neighbourhoods of Lyon, followed by the list.
- Contact: phone and email buttons.
- Hero: an Image block bound to Town photo (Attributes → RowSprout property). A Heading block (H1) with the text
Your roofer in @code_town_210@, and a ParagraphWorking in @code_area_210@. A Button block whose link is bound to Phone; it becomes atel:link. - Introduction: a Paragraph block bound to Introduction. The line breaks of the Textarea are kept. Type a fallback text in the block: it shows when a row leaves the property empty.
- Services: three Columns with a Heading and a Button each. For the links, see Link to the service pages below.
- Neighbourhoods: a Heading
We work in these neighbourhoods of @code_town_210@and the Item List block (Pro) set to Neighbourhoods. - Contact: two Buttons, one bound to Phone, one to Contact email (becomes a
mailto:link).
- Hero: the Thumbnail widget (Pro) shows the town photo. Elementor’s own Heading widget (H1) with the title
Your roofer in @code_town_210@, a Text Editor withWorking in @code_area_210@, and the RowSprout Button widget with Link property Phone. - Introduction: the Textarea widget set to Introduction.
- Services: three Icon Boxes, each with a button. Link them with the Page Link tag (Pro), see below.
- Neighbourhoods: a Heading with a token and the Item List widget (Pro). It shows up to six items in two columns, so keep the list short or use a Text Editor for longer ones.
- Contact: two Button widgets, one with Link property Phone, one with Contact email. A button whose property is empty is hidden on that page.
- Hero: a Custom Heading
Your roofer in @code_town_210@, a Text Block withWorking in @code_area_210@, and a Button whose link istel:@code_phone_210@(enter the phone numbers without spaces for this). For the photo, use the page’s featured image through your theme, which a Thumbnail property (Pro) sets per row. - Introduction: a Text Block with the token
@code_intro_210@. A token puts the value in as one line, so write the introduction as one paragraph, or use the block editor or Elementor for multi-line text. - Services: three columns with a heading and a button each; see the links below.
- Neighbourhoods: the Item List element (Pro) set to Neighbourhoods, in 1 to 4 columns.
- Contact: two Buttons with the links
tel:@code_phone_210@andmailto:@code_email_210@.
The child templates: one page per service per town
Section titled “The child templates: one page per service per town”-
Create the child. First generate the parent’s pages: a child template can only generate pages once its parent has them. Then add a new template, Roof repair, and choose Roofer as its Parent on the General tab. The child gets a row for every town of the parent, with the parent’s values filled in. Title and URL are locked: they come from the parent’s row.
-
Set the address. The Href of a child is only the last part of the address, because every child page is placed under its parent page. Enter
/roof-repair, and the Lyon page lives at/roofer-lyon/roof-repair/. -
Set the title. Use a token from the parent in the child’s title:
Roof repair in @code_town_210@. A child page understands the parent’s tokens. -
Add properties of its own. The child can have properties the parent doesn’t, such as Repair introduction (Textarea): a text about roof repair in that town. Fill it in per row on the child’s Groups tab. A value the child leaves empty is taken from the parent’s row, so the phone number and neighbourhoods need no typing again.
-
Design and generate. Design the page as above, with a heading such as Roof repair in Lyon: fixed within 48 hours, and save with Create & update pages. A child page is only generated once the parent’s page for that row exists.
Repeat for Gutter cleaning. A new town added to the parent automatically gets a roof repair and a gutter cleaning page on the next generation.
Link to the service pages
Section titled “Link to the service pages”On Roofer in Lyon, the service cards should link to the Lyon service pages; on the Grenoble page, to the Grenoble ones.
- Sibling Links widget (Pro, Elementor): add one entry per service, with the Template and a Link text. On a child page, the same widget links to the other services for that town. See Sibling Links.
- Page Link tag (Pro, Elementor): for a single button, such as Need a repair?, choose RowSprout Page Link in the button’s link and pick the Roof repair template. See Page Link.
- Without Pro, or in the block editor and WPBakery: build the link from the parent’s URL token:
/roofer-@code_href_210@/roof-repair/. This works, but breaks silently when you change a Href pattern later, so update these links whenever you do.
The overview page
Section titled “The overview page”Make a normal WordPress page Service area and add a Grid (block, Elementor widget or WPBakery element) with RowSprout template set to Roofer. It lists every town page and grows with every new row. To show the town photos as cards, choose Layout Cards (in Elementor, Layout Type Cart Layout) with Show thumbnail on, and sort them with Sort items Alphabetical (A-Z).
A Grid of a child template lists the child pages of every town. Set Show title to Child title to show Roof repair in Lyon instead of the parent’s title.