4.1 KiB
00 — WP + Divi to AM Stack A Pipeline — Overview
Converts a .wpress archive (All-in-One WP Migration) into a Stack A deployment: PHP router + SQLite databases + vanilla JS/CSS. Never a 1:1 Divi copy. Every migration is a content extraction and redesign, not a port.
Stack A output (what this pipeline produces)
src/api/router.php URL dispatcher
src/api/contact.php form handler (Resend via curl)
src/api/templates/*.php home | static | classes | schedule | glossary | blog
src/api/components/_header.php nav from nav.sqlite
src/api/components/_footer.php
src/api/data/*.sqlite one DB per content domain (see 09-stack-a-output.md)
build/seed_databases.py creates + seeds all SQLite DBs — THE source of truth
assets/ vanilla CSS/JS/images
infra/nginx.conf, supervisord.conf, php-fpm-pool.conf
Dockerfile (php:8.3-fpm-alpine)
docker-compose.yml
Why NOT static HTML
Any site with a glossary, blog, schedule, or recurring content model gets Stack A. Editing content = edit seed_databases.py → reseed → rebuild. No PHP file edits.
Divi is the data source, not the design target
Extract from Divi:
- Page content (headings, body copy, CTAs)
- Navigation menus (wp_terms + wp_termmeta)
- Header logo + tagline (wp_options: blogname, blogdescription, et_divi)
- Media (uploads/ → WebP → assets/images/)
- Design tokens (colors, fonts → tokens.css)
- SEO (Yoast wp_postmeta → pages.sqlite meta_description)
- Blog posts (wp_posts where post_type=post)
- Custom post types (testimonials, FAQs, glossary terms if present)
Do NOT replicate:
- Divi section/row/column grid structure
- Divi module types (blurbs, toggles, CTAs, pricing tables)
- WordPress page slugs (map to clean slugs per nginx.conf pattern)
- WordPress menu item IDs
Pipeline phases
Phase 0 Setup Point pipeline at .wpress file; create working dirs
Phase 1 Extract Unpack .wpress → wpress-extract/
Phase 2 DB Analysis Parse SQL dump; detect Divi version; inventory pages, posts, menus
Phase 3 Content Extract page sections + nav menus + blog posts from Divi
Phase 4 Design Pull colors + fonts → tokens.css draft
Phase 5 Media Catalog uploads/; convert to WebP; build media-manifest.json
Phase 6 Staging Map extracted JSON → seed_databases.py skeleton (content on standby)
Phase 7 Fill Agent fills each SQLite table row by row from staged JSON
Phase 8 Templates Scaffold PHP templates + components from AM reference
Phase 9 SEO Port titles, metas, canonicals, schema.org, redirect map
Phase 10 Build docker compose build && docker compose up -d
Phase 11 QA Lighthouse, protection check, grep for Divi residue
CLI launcher
python3 scripts/migrate.py --wpress /path/to/backup.wpress --domain example.com
Runs phases 0-6 automatically, then prints agent breadcrumbs for phases 7-11.
Key missed items from prior migrations (REQUIRED fixes)
-
NAV MENUS: Must extract wp_terms (taxonomy=nav_menu) + wp_termmeta for label/URL/order. Output: nav.json → seeded into nav.sqlite (label, href, display_order, is_cta).
-
DIVI HEADER: Must extract et_divi options from wp_options for logo, header layout, colors. The _header.php must be written from scratch using AM design tokens, not copied from Divi.
-
MEDIA: All uploads/ files must be: cataloged → copied to assets/images/ → converted to WebP. Every image reference in content JSON must be updated to /assets/images/{filename}.webp.
-
SECTION REMAPPING: Divi modules must be remapped to AM section types.
- blurb_module → feature_cards item
- toggle_module → accordion item
- cta_module → cta_band section
- pricing_module → booking_options section
- testimonial_mod → testimonials.sqlite row
- text_module → text_block section
Related SOPs
- 09-stack-a-output.md — SQLite schema + sections_json spec
- 10-agent-breadcrumbs.md — Step-by-step ordered checklist for agent execution
- 00-stack-philosophy.md — Stack A vs Stack B decision rationale