Migration von WordPress zu Hugo: Auslesen der Datenbank
WordPress ist ein Content Management System und eine weit verbreitete Blogging-Plattform, die in PHP geschrieben ist und MySQL oder MariaDB als Datenbank verwendet. In diesem Artikel zeige ich Dir, wie Du die vorhandenen Beiträge aus einem Datenbank-Backup extrahieren kannst, um sie später für Hugo, einem statischen Websitegenerator, aufzubereiten.
Hintergrund ist die Ablösung einer in die Jahre gekommenen Wordpress-Installation eines Vereins, die ich durch eine statische Website ersetzen möchte. Durch verschiedene Plugins und mehrere PHP-Upgrades ist die Installation nicht mehr stabil und es ist an der Zeit, sie durch eine moderne Lösung zu ersetzen. Der bisherige für die Wordpress-Installation verantwortliche Hosting-Provider hat mir ein Datenbank-Backup zur Verfügung gestellt, aus dem ich die vorhandene Inhalte auslesen möchte.
Docker-Container für MariaDB und phpMyAdmin
Im ersten Schritt verwende ich Docker, um zwei Container zu starten, die eine MariaDB-Datenbank und eine phpMyAdmin-Instanz bereitstellen. Über phpMyadmin kann ich das Datenbank-Backup einlesen. Folgende docker-compose.yml
beschreibt das Container-Setup:
version: '3.3'
services:
mariadb:
image: mariadb:latest
ports:
- "3306:3306"
environment:
- MARIADB_DATABASE=wordpress
- MARIADB_USER=wordpress
- MARIADB_PASSWORD=wordpress
- MARIADB_ROOT_PASSWORD=root
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
- PMA_HOST=mariadb
- PMA_PORT=3306
- PMA_USER=root
- PMA_PASSWORD=root
depends_on:
- mariadb
Mit dem Befehl docker compose up
starte ich die Container. Im Webbrowser kann ich nun über die URL http://localhost:8080
auf phpMyAdmin zugreifen und über die Importfunktion das Datenbank-Backup in die Datenbank wordpress
einspielen.
Auslesen der Beiträge und Seiten
Nach dem erfolgreichen Import des Datenbank-Backups kann ich nun die Beiträge und Seiten auslesen. Diese werden in der Tabelle wp_posts
mit den Werten post
bzw. page
in der Tabelle post_type
gespeichert. Für die Ausgabe in HTML-Dateien erstelle ich folgendes Deno-Skript mit dem Namen extract-from-database-dump.js
:
import { Client } from "https://deno.land/x/mysql/mod.ts";
const client = await new Client().connect({
hostname: "127.0.0.1",
db: "wordpress",
username: "root",
password: "root",
});
const saveToHTMLFile = async (filename, post_title, post_content) => {
const output = `<h1>${post_title}</h1>
${post_content}`;
await Deno.writeTextFile(filename, output);
};
const posts = await client.query(`SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY ID ASC`);
for (const post of posts) {
const { post_name, post_title, post_date, post_content } = post;
const filename = `./${post_date.toISOString().substring(0,10)}-${post_name}.html`;
await saveToHTMLFile(filename, post_title, post_content);
}
const pages = await client.query(`SELECT * FROM wp_posts WHERE post_type = 'page' AND post_status = 'publish' ORDER BY ID ASC`);
for (const page of pages) {
const { post_name, post_title, post_date, post_content } = page;
const filename = `./${post_name}.html`;
await saveToHTMLFile(filename, post_title, post_content);
}
Das Skript starte ich über folgenden Befehl:
deno run --allow-net=127.0.0.1:3306 --allow-write=./ extract-from-database-dump.js
Zwischenstand
Die Beiträge und Seiten liegen mir nun als HTML-Dateien vor. Im einem nachfolgenden Artikel werde ich diese in Markdown-Syntax umwandeln, um sie in Hugo verwenden zu können.
Tags: