Python Script for migrating from Wordpress to Hugo
Here’s a simple script that I wrote in python for helping to migrate from a wordpress blog to a static hugo site.
- It uses the jinja, slugify, and mysql.connector libraries.
- It connects directly to the Wordpress database and extracts the compiled HTML from Wordpress
- For simplicity, it does not handle tags
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
- 2024
- Reinstalling Windows at 1am
- SQLite DB Migrations with PRAGMA user_version
- My Custom Miniflux CSS Theme
- How to Disable Wayland in Debian Testing
Recent Favorite Blog Posts
This is a collection of the last 8 posts that I bookmarked.
- Give Your Spouse the Gift of a Couple's Email Domain from mtlynch.io
- Skip the Next iPhone from Articles on Jose M.
- Have smart glasses finally hit an inflection point? from The Torment Nexus
- The McPhee method from the jsomers.net blog
- Pluralistic: LLMs are slot-machines (16 Aug 2025) from Pluralistic: Daily links from Cory Doctorow
- Pluralistic: Bluesky creates the world's weirdest, hardest-to-understand binding arbitration clause (15 Aug 2025) from Pluralistic: Daily links from Cory Doctorow
- Just a Little More Context Bro, I Promise, and It’ll Fix Everything from Jim Nielsen’s Blog
- The Futzing Fraction from Deciphering Glyph
Articles from blogs I follow around the net
Give a Problem. Grow a Programmer.
In 2009, I kicked off my senior year in college with a class that ultimately changed the way I thought about my degree—and my future.
via flower.codes September 15, 2025Yala stablecoin depegs after theft
The YU bitcoin-backed stablecoin list its intended dollar peg after what they described as "an attempted attack", later writing that there was an "unauthorized transfer of funds". Although they initially wrote that …
via Web3 is Going Just Great September 15, 2025How big a solar battery do I need to store *all* my home's electricity?
I have a modest set of solar panels on an entirely ordinary house in suburban London. On average they generate about 3,800kWh per year. We also use about 3,800kWh of electricity each year. Obviously, we can't use all the power produced over summer an…
via Terence Eden’s Blog September 15, 2025Generated by openring