Python Script for migrating from Wordpress to Hugo

| blogging | python | snippets |

Here’s a simple script that I wrote in python for helping to migrate from a wordpress blog to a static hugo site.

from dataclasses import dataclass
from datetime import datetime

import mysql.connector
from jinja2 import Template
from slugify import slugify


@dataclass 
class Post:
    date:datetime
    title:str
    content:str
    filename:str

posts = []

try:

    conn = mysql.connector.connect(
        host='localhost',
        port=3306,
        database='wordpress',
        user='wp_admin',
        password='$YOUR_DB_PASSWORD'
    )

    cursor = conn.cursor()

    query = """
    select post_date, post_title, post_content from $YOUR_POSTS_TABLE 
    where post_type = 'post' 
    order by post_date
    """
    cursor.execute(query)

    rows = cursor.fetchall()

    for row in rows:
        posts.append(Post(row[0], row[1], row[2], slugify(row[1])))

    template = Template("""+++
title = "{{title}}"
date = {{date}}
draft = false
tags = ['']
+++
                    
{{content}}
    """)

    for post in posts:
        path = f"import/{post.date.year}-{post.filename}.md"
        with open(path, "w") as f:
            f.write(
                template.render(
                    title=post.title,
                    date=post.date.strftime('%Y-%m-%dT%H:%M:%S%z'),
                    content=post.content
                )
            )

    print([post.filename for post in posts])

except mysql.connector.Error as e:
    print(e)

finally:
    cursor.close()
    conn.close()

Thank you for reading! Share your thoughts with me on bluesky, mastodon, or via email.

Check out some more stuff to read down below.

Most popular posts this month

Recent Favorite Blog Posts

This is a collection of the last 8 posts that I bookmarked.

Articles from blogs I follow around the net

Bandcamp is Taking Slop Head On with Unequivocal Ban, to the Cheers of Music Lovers Everywhere

’Tis But Some Quick News for January 16, 2026 Bandcamp read the room. It is the hero we need in our hour of darkness. Amidst an onslaught of horrendous AI-generated slop pretending to be music (Spotify is rife with this garbage, though they keep claiming …

via The Internet Review January 16, 2026

Pluralistic: Catch this! (16 Jan 2026)

Today's links Catch this! Email is good, actually. Hey look at this: Delights to delectate. Object permanence: LDS excommunication; King Foundation v "I Have a Dream"; "Lat-stage capitalism" v "Christ, what an asshole"; Pelosi …

via Pluralistic: Daily links from Cory Doctorow January 16, 2026

Liberating the ASUS CX1100CN Chromebook with OpenBSD

Liberating the ASUS CX1100CN Chromebook with OpenBSD 2026-01-16 I’ve always enjoyed the idea of having a portable, lightweight, 11 inch laptop for my personal use for around the house and small trips. A device that I wouldn’t have to be concerned about just…

via btxx.org RSS Feed January 16, 2026

Generated by openring