This commit makes the site editable from WP admin (Gutenberg or Bricks
"Edit with Bricks") and translatable via WPML Translation Editor by
shifting page rendering away from Custom Templates and into post_content.
Architecture change
-------------------
Before: Custom Templates assigned to each page (page-solution-detail.php
etc.) generated the page HTML at runtime by reading from inc/*-data.php
arrays. WPML had nothing to translate, Bricks Builder had nothing to
edit, the client could only modify content by editing PHP.
After:
- Pages now hold their full Gutenberg HTML inside post_content
- The default page.php template renders the_content() — no Custom
Templates assigned anymore
- Bricks Builder picks up post_content and converts it to its element
tree when "Edit with Bricks" is clicked
- WPML Translation Editor exposes every block for translation
- The client can edit pages directly in WP admin
What this commit ships
----------------------
- inc/render-blocks.php: data array → Gutenberg HTML payload generator
with helpers per section type (prose / cards / list / cta) and per
page archetype (solution / industry / technology / editorial / form
/ overview hub).
- inc/shortcodes.php: [av_form slug="request-demo"] for dynamic form
blocks (forms can't live as static HTML — they need nonces and
per-request state).
- inc/i18n.php: av_lang() / av_t() helpers for inline string translation
in header.php and footer.php (covers ~80 UI strings); switches based
on WPML's wpml_current_language filter.
- page.php: minimal default template — get_header() + the_content() +
get_footer().
- header.php: real WPML language switcher driven by
wpml_active_languages filter (replaces the placeholder EN · FR
toggle); UI strings now route through av_t().
- footer.php: same UI string treatment.
- Custom Templates retained but no longer assigned (pages were stripped
by the migration mu-plugin); they remain available if a page wants
to opt back into the data-file pattern.
Operational migrations (one-shot mu-plugins, not versioned)
-----------------------------------------------------------
1. asterion-migrate-to-blocks.php walked all 26 PHP-templated pages,
pre-rendered them via the new render-blocks helpers, wrote the
result to post_content, and stripped _wp_page_template.
2. asterion-duplicate-fr.php cloned all 35 pages into French via WPML
API, preserved parent/child hierarchy, linked translations through
the trid table, marked them as duplicates pending refinement.
3. asterion-fix-fr-slugs.php aligned French slugs with English ones
(WP's wp_unique_post_slug() had appended -2 suffixes; we bypass
via $wpdb->update so /fr/solutions/ resolves correctly).
Verified
--------
- All 35 EN URLs return HTTP 200
- All 35 FR URLs return HTTP 200 under /fr/<slug>/
- Language switcher in header outputs correct hreflang links
- WPML emits hreflang en / fr / x-default in <head>
- Body class confirms wp-child-theme-asterion-bricks active
- Bricks frontend CSS still enqueued
- Inter Variable still preloaded
Next steps
----------
- French content is currently the duplicated EN copy. Translate via
WP admin → WPML → Translation Editor (per-block UI), or edit pages
directly in /fr/<slug>/ via Gutenberg / Bricks
- WPML String Translation can scan the theme to surface av_t() / __()
strings for UI-level translation overrides
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Implements the 5 Solutions pages (1 hub + 4 tier detail) with full EN copy
from PDF Strategie & Contenu D.2-D.6.
Architecture
- inc/solutions-data.php: single PHP array keyed by slug, holds the 4 tiers
(my-proserve, proserve-flex, proserve-academy, customization). Each tier
declares its hero, sections, and optional upsell. Section schema supports
4 types: prose / cards / list / cta.
- template-parts/solution-detail.php: reusable partial that iterates the
sections of a tier and renders each per its type. Alternates light/dark
backgrounds for visual rhythm.
- templates/page-solution-detail.php: WP custom Page Template
("Template Name: Solution Detail"). Looks up the current page slug,
pulls the matching tier from solutions-data.php, and hands off to the
partial. Falls back gracefully if the slug is unknown.
- templates/page-solutions-overview.php: WP custom Page Template
("Template Name: Solutions Overview") for /solutions/. Renders the
3-tier comparison table + PROSERVE+ teaser.
Pages were seeded into the DB by a one-shot mu-plugin
(wp-content/mu-plugins/asterion-seed-solutions.php in LocalWP) that
created the parent /solutions/ page and 4 children with the right
post_parent + _wp_page_template, then self-deleted.
Verified all 5 URLs return HTTP 200:
/solutions/ 62 KB
/solutions/my-proserve/ 65 KB
/solutions/proserve-flex/ 65 KB
/solutions/proserve-academy/ 63 KB
/solutions/customization/ 62 KB
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>