Files
arisingmedia-web-sops/wp-divi-pipeline-to-am-stack/00-overview.md
T
2026-06-09 18:31:59 +02:00

95 lines
4.1 KiB
Markdown

# 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)
1. **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).
2. **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.
3. **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.
4. **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