Skip to content

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.

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 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.

  • 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/.

  1. 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.
  2. Introduction: the town’s own text.
  3. Services: three cards linking to the service pages for this town.
  4. Neighbourhoods: We work in these neighbourhoods of Lyon, followed by the list.
  5. 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 Paragraph Working in @code_area_210@. A Button block whose link is bound to Phone; it becomes a tel: 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).

The child templates: one page per service per town

Section titled “The child templates: one page per service per town”
  1. 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.

  2. 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/.

  3. 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.

  4. 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.

  5. 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.

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.

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.