blog@abshoff.dev:Web, Mobile & Cloud$ ls

Migration von WordPress zu Hugo: Auslesen der Datenbank

Umzugskartons

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: