Pages

Page SEO, detail pages with URL patterns, passwords and access rules.

This is the guide the PageHub MCP server gives an AI agent for get_style_reference({ topic: "pages" }). Names like set_theme are its tools (connect one), and the liquid topic is the HTML + Liquid reference.
  • A page is a record (route, SEO, flags) plus its file pages/<slug>.liquid. The display name becomes the slug: "Our Services" → /our-services. add_page needs text: the page's HTML + Liquid, shaped like an existing page ({% render 'header' %} … {% render 'footer' %}). The first page is home.
  • Set seo.title and seo.description on every page. A page without seo.title falls back to the site-level title — never to its display name — so every page ships the same <title>. The site-level title/description are edited with update_site and read with select_site.
  • seo.jsonLd is one schema.org object (FAQPage, Article, BreadcrumbList); seo.schema is an array, one <script type="application/ld+json"> each.
  • Page markup is the file: per-page head code is a tag in the file's <head>, body classes go on the file's <body>, and a landing page without chrome simply omits the {% render 'header' %} / {% render 'footer' %} lines. update_page refuses headCode, footerCode, bodyClass and hide* with that guidance.
  • update_page({ policy }) sets who may open a page and how it looks on its own: password (hashed, never shown back), access (condition groups; a denied visitor gets failAction redirect + redirectUrl, or show-page + fallbackPath), bodyClass, themeOverrides (CSS variables for this page); "" or [] clears a key. list_pages({ pageId }) reads it back. To gate a page on a plan use access with the auth condition, or gate the content inside the page (see members). It takes effect on publish.
  • isHidden pages are not reachable by URL. You can't delete the last page; deleting home promotes the next page.
  • pathPattern makes a detail page: the URL tail AFTER the page's slug, literal segments or :param, no leading slash. Page "Car" + :slug serves /car/<slug>; page "Shop" + products/:handle serves /shop/products/<handle>. The segment count must match exactly. Read captures as request.params.<name>. A tail that doesn't fit, or a filter that matches no row, serves the 404 page. Empty string clears.