Migrere en blogg fra Ghost til WordPress med REST API

En blogg ble flyttet fra Ghost til WordPress uten import-plugin og uten SQL-dump, bare med de to REST-API-ene og et script imellom. Ghost skulle slås av rett etterpå, så innhold, bilder og datoer måtte over i én runde.
Hent innholdet fra Ghost i ett kall

Ghost Content API leverer ferdig HTML, så du slipper Markdown-konvertering og egen rendering. Be om HTML og plaintext i samme kall, og ta med tagger og forfattere.
GET https://blogg.example.com/ghost/api/content/posts/Feltet
?key=CONTENT_API_KEY
&formats=html,plaintext
&include=tags,authors
&limit=allhtml kan publiseres som det er. Plaintext brukes til utdrag. Tagger og forfattere trengs når alt skal mappes mot WordPress.
Bildene må lastes opp på nytt
Bilde-URL-ene i Ghost-HTML-en peker til Ghost-serveren, og de slutter å virke når instansen slås av. Hvert bilde må lastes ned, lastes opp til WordPress og få URL-en byttet ut i innholdet før posten publiseres.
Opplasting til media-endepunktet krever en Content-Disposition-header med filnavn. Uten den får du ikke satt navnet på fila.
POST /wp-json/wp/v2/mediaSvaret inneholder en ny
Content-Disposition: attachment; filename="bilde.jpg"
Content-Type: image/jpeg
<binaere bildedata>source_url. Bytt den inn for den gamle Ghost-URL-en i HTML-en, for hvert bilde i hver post, før innholdet sendes videre. Et bilde som blir glemt, peker etterpå til en server som ikke finnes.
wpautop ødelegger egen HTML

WordPress kjører alt innhold gjennom wpautop. Filteret setter inn p og br ut fra hvor linjeskiftene ligger. Det brekker grid- og flex-layout og deler opp script-blokker ved hver blanke linje.
To regler holder innholdet intakt:
- Ikke ha blanke linjer i egen HTML. En blank linje blir et nytt avsnitt.
- Legg all kode i
wp:code-blokker. Innholdet i dem lar WordPress stå urørt.
<!-- wp:code -->Publiser med riktig datoPostene publiseres via posts-endepunktet. Sett feltet
<pre class="wp-block-code"><code>din kode her</code></pre>
<!-- /wp:code -->date til originaldatoen fra Ghost. Uten det får alle postene dagens dato, og kronologien på bloggen forsvinner.
Tagger og kategorier oppgis som ID-er, ikke navn. Slå opp de som finnes, opprett de som mangler, og send listene med ID-er.
POST /wp-json/wp/v2/posts
{
"title": "Original tittel",
"content": "<innhold med nye bilde-URL-er>",
"status": "publish",
"date": "2024-11-03T09:14:00",
"categories": [12, 45],
"tags": [7, 19]
}Rekkefølgen
- Hent posten.
- Last opp bildene og bytt URL-ene.
- Map tagger og kategorier til ID-er.
- Publiser med originaldato, uten blanke linjer og med all kode i wp:code.
- Slå av Ghost.


