Guide

Static site generator format

-f ssg writes a drop-in content source for SSG and other static site generators. Where markdown is a faithful dump of what WordPress returned, ssg is a content source: one name per concept, paths that mirror the site, and body HTML cleaned of the old theme's scaffolding.

A drop-in content source for spagu/ssg and other static site generators. Where markdown is a faithful dump of what WordPress returned, ssg is a content source: one name per concept, paths that mirror the site, and body HTML cleaned of the old theme's scaffolding.

1wpexportjson export --url https://example.com -f ssg -o export/site \
2  --assisted-crawl --crawl-content

📂 Layout

export/site/
├── metadata.json                       categories / tags / users / media
├── comments.json                       reader comments, addressed by page URL
├── pages/
│   ├── about.md                        /about/
│   └── baby-water-instructor/
│       └── cost.md                     /baby-water-instructor/cost/
├── posts/
│   └── swimming/
│       └── swimming-lesson.md          posts sit at least one level below posts/
└── media/images/…

Pages are nested to mirror their URL, so the site's information architecture stays visible in the file tree. Posts sit under their category; one with no resolvable category lands in posts/uncategorized/.

📝 Front Matter

Single-spelled — a generator reads one name per concept, not three:

Key Source
title seo_title if the site rendered one, else the post title
slug, status, type as reported by WordPress
date, modified RFC 3339
link root-relative by default (--link-style absolute to change)
author resolved to a name via metadata.json users[]
category the post's first named category
description meta_description, else og_description, else the excerpt
excerpt plain text, theme "Continue reading" chrome removed
featured_image localised media path

Empty values emit no key at all, so a generator sees an absent key rather than an empty string.

🧹 Content Cleanup

Applied to the body of every ssg document:

Transform Why
HTML entities → UTF-8 (–, …) The file is UTF-8; the entities are noise that survives into the rendered page. <, >, &, " and ' stay encoded — decoding those would turn escaped markup into live markup
alt filled from the media library's alt_text WCAG 2.2 SC 1.1.1 Non-text Content. An existing alt is never overwritten
WordPress classes dropped (wp-image-*, size-*, align*, attachment-*, wp-block-*) They refer to the old theme's stylesheet. Authored classes are kept
title dropped when it merely repeats the filename Carries no information a reader can use
loading, decoding, sizes dropped Browser hints the generator emits itself

The markdown format keeps its existing output, with two exceptions that were plainly bugs: entities are decoded there too, and the excerpt no longer carries the "Continue reading" anchor.