Lewati ke konten
Kembali ke Blog

Cara Migrasi Website WordPress ke Hugo Static Site

· · 9 menit baca

Migrasi dari WordPress ke Hugo adalah keputusan yang bagus untuk performa, security, dan cost efficiency. Tutorial ini akan membimbing Anda melalui seluruh proses migrasi step-by-step.

Mengapa Migrasi dari WordPress ke Hugo?

Perbandingan WordPress vs Hugo

AspekWordPressHugo
HostingServer + Database requiredStatic hosting (CDN)
SecurityVulnerabilities, pluginsNo database, no server-side code
SpeedDepends on hosting<1s loading time
Cost$5-50+/monthFree or $0-5/month
MaintenanceRegular updates requiredMinimal
ScaleCache required untuk high trafficCDN handles scale automatically
SEOPlugin dependentBuilt-in optimization

Benefits Migrasi ke Hugo

  1. Kecepatan: Static site = instant loading
  2. Security: No database = no SQL injection
  3. Cost: Free hosting di banyak platform
  4. Reliability: CDN = 99.99% uptime
  5. Version Control: Semua content di Git
  6. Developer Experience: Markdown + Git workflow

Pre-Migration Planning

1. Audit WordPress Site

Content Inventory:

# List semua posts dan pages
# Gunakan plugin: Export to Markdown atau manual export

Check:

  • Total posts
  • Total pages
  • Custom post types
  • Categories dan tags
  • Media files
  • Comments
  • Users

Plugin untuk Export:

  1. WordPress to Jekyll Exporter (works untuk Hugo)
  2. WP Static HTML Output
  3. Simply Static
  4. Static HTML Output

2. URL Structure Planning

Match atau Redirect?

WordPress URL: /2024/02/03/hello-world/
Hugo URL:     /blog/hello-world/

Decision:

  • Keep same: /:year/:month/:day/:slug/
  • New structure: /:slug/
  • Redirect old URLs ke new

Step 1: Export Content dari WordPress

Method 1: WordPress to Jekyll Exporter

  1. Install Plugin
    – Dashboard → Plugins → Add New
    – Search: “WordPress to Jekyll Exporter”
    – Install dan Activate

  2. Export
    – Tools → Export to Jekyll
    – Download file .zip

  3. Extract
    bash
    unzip jekyll-export.zip -d wordpress-export/

Method 2: Manual Export dengan WP-CLI

# Install WP-CLI jika belum
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

Export posts ke Markdown

wp post list --format=ids | xargs -I {} wp post get {} --field=content --format=json > posts.json

Atau gunakan plugin untuk bulk export

Method 3: Database Export

-- Export posts
SELECT post_title, post_content, post_date, post_name 
FROM wp_posts 
WHERE post_type = 'post' AND post_status = 'publish';

Step 2: Setup Hugo Project

1. Create Hugo Site

# Install Hugo jika belum
# (lihat artikel install Hugo)

Buat site baru

hugo new site my-wordpress-migration cd my-wordpress-migration

Initialize Git

git init

Install theme

Pilih theme yang mirip dengan WordPress theme Anda

git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke

2. Configure Hugo

hugo.toml:

baseURL = 'https://yourdomain.com'
languageCode = 'en-us'
title = 'Your Site Title'
theme = 'ananke'

Match WordPress permalink structure

[permalinks] posts = '/:year/:month/:day/:slug/'

Preserve WordPress categories dan tags

[taxonomies] category = 'categories' tag = 'tags'

[params] author = 'Your Name' description = 'Site description'

Step 3: Convert dan Import Content

1. Convert WordPress XML ke Markdown

Gunakan tool: wordpress-to-hugo-exporter

# Clone tool
git clone https://github.com/SchumacherFM/wordpress-to-hugo-exporter.git
cd wordpress-to-hugo-exporter

Install dependencies

composer install

Export WordPress content

php hugo-export.php

2. Manual Conversion Script

Python script untuk convert:

#!/usr/bin/env python3
import re
import os
from datetime import datetime

def convert_wordpress_to_hugo(wp_file, output_dir): with open(wp_file, 'r', encoding='utf-8') as f: content = f.read()

# Extract title
title_match = re.search(r'title: (.*)', content)
title = title_match.group(1) if title_match else 'Untitled'

# Extract date
date_match = re.search(r'date: (\d{4}-\d{2}-\d{2})', content)
date_str = date_match.group(1) if date_match else datetime.now().strftime('%Y-%m-%d')

# Create frontmatter
frontmatter = f&quot;&quot;&quot;---

title: "{title}"
date: {date_str}T00:00:00+00:00
draft: false

"""

# Clean WordPress content
body = re.sub(r'---.*?---', '', content, flags=re.DOTALL)
body = clean_wordpress_content(body)

# Write to file
slug = re.sub(r'[^\w\s-]', '', title).strip().lower()
slug = re.sub(r'[-\s]+', '-', slug)

output_file = os.path.join(output_dir, f&quot;{date_str}-{slug}.md&quot;)
with open(output_file, 'w', encoding='utf-8') as f:
    f.write(frontmatter + body)

print(f&quot;Created: {output_file}&quot;)

def clean_wordpress_content(content):

Remove WordPress-specific tags

content = re.sub(r'\[.*?\]', '', content)  # Shortcodes
content = re.sub(r'&lt;!--.*?--&gt;', '', content, flags=re.DOTALL)  # Comments

# Convert HTML ke Markdown jika perlu
# atau keep HTML yang valid

return content.strip()

Usage

convert_wordpress_to_hugo('wordpress-post.txt', 'content/posts/')

3. Import ke Hugo

# Copy converted files
cp -r wordpress-export/content/* my-hugo-site/content/

Organize structure

mkdir -p content/posts content/pages mv content/20 content/posts/ # Move dated posts mv content/page- content/pages/ # Move pages

4. Fix Frontmatter

Batch fix dengan script:

#!/bin/bash
# fix-frontmatter.sh

for file in content/posts/*.md; do

Add description jika tidak ada

if ! grep -q "^description:" "$file"; then sed -i 's/^---$/---\ndescription: ""/g' "$file" fi

Add categories jika tidak ada

if ! grep -q "^categories:" "$file"; then sed -i 's/^---$/---\ncategories: []/g' "$file" fi done

Step 4: Handle Media Files

1. Export Media dari WordPress

# Download all media files
# Option 1: Gunakan plugin "Export Media Library"

Option 2: Manual download

wget --mirror --convert-links --adjust-extension \ --page-requisites --no-parent \ https://yourwordpresssite.com/wp-content/uploads/

2. Organize di Hugo

# Move ke Hugo static folder
mkdir -p static/images/wp-content
mv wordpress-uploads/* static/images/wp-content/

Optimize images (opsional)

Gunakan Hugo image processing atau tools seperti ImageMagick

3. Update Image URLs

Script untuk replace URLs:

#!/usr/bin/env python3
import re
import os

def update_image_urls(directory): for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.md'): filepath = os.path.join(root, file)

            with open(filepath, 'r', encoding='utf-8') as f:
                content = f.read()

            # Replace WordPress URLs dengan Hugo URLs
            content = re.sub(
                r'https?://[^\s\&quot;]+/wp-content/uploads/(\d{4})/(\d{2})/([^\s\&quot;]+)',
                r'/images/wp-content/\1/\2/\3',
                content
            )

            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(content)

            print(f&quot;Updated: {filepath}&quot;)

update_image_urls('content/')

Step 5: Setup Redirects

1. Create Redirects File

static/_redirects (untuk Netlify):

# Redirect old WordPress URLs ke Hugo URLs
/blog/:year/:month/:day/:slug/  /posts/:slug/  301
/category/:name/                 /categories/:name/  301
/tag/:name/                     /tags/:name/  301
/author/:name/                  /authors/:name/  301
/feed/                          /index.xml  301
/wp-content/uploads/*           /images/wp-content/:splat  301

static/.htaccess (untuk Apache):

RewriteEngine On

Redirect WordPress posts

RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/]+)/?$ /posts/$4/ [R=301,L]

Redirect categories

RewriteRule ^category/([^/]+)/?$ /categories/$1/ [R=301,L]

Redirect tags

RewriteRule ^tag/([^/]+)/?$ /tags/$1/ [R=301,L]

2. Generate Redirects dari WordPress

Script untuk extract URLs:

#!/usr/bin/env python3
import re

def generate_redirects(wp_export_file): redirects = []

# Read WordPress export
with open(wp_export_file, 'r') as f:
    content = f.read()

# Extract post URLs
post_urls = re.findall(r'https?://[^\s\&quot;]+/\d{4}/\d{2}/\d{2}/([^/\s\&quot;]+)', content)

for slug in post_urls:
    old_url = f&quot;/20*/20*/20*/{slug}/&quot;
    new_url = f&quot;/posts/{slug}/&quot;
    redirects.append(f&quot;{old_url} {new_url} 301&quot;)

# Write to file
with open('static/_redirects', 'w') as f:
    f.write('\n'.join(redirects))

print(f&quot;Generated {len(redirects)} redirects&quot;)

generate_redirects('wordpress-export.xml')

Step 6: Handle Comments

Option 1: Static Comments (Export)

# Export comments dari WordPress
# Gunakan plugin "Export Comments to JSON"

Convert ke static HTML atau YAML

Option 2: Third-party Comments

Disqus:

<!-- layouts/partials/comments.html -->
{{ if .Site.Params.disqus }}
<div id="disqus_thread"></div>
<script>
  var disqus_config = function () {
    this.page.url = "{{ .Permalink }}";
    this.page.identifier = "{{ .RelPermalink }}";
  };
  (function() {
    var d = document, s = d.createElement('script');
    s.src = 'https://{{ .Site.Params.disqus }}.disqus.com/embed.js';
    s.setAttribute('data-timestamp', +new Date());
    (d.head || d.body).appendChild(s);
  })();
</script>
{{ end }}

Utterances (GitHub-based):

<script src="https://utteranc.es/client.js"
        repo="username/repo"
        issue-term="pathname"
        theme="github-light"
        crossorigin="anonymous"
        async>
</script>

Step 7: Build dan Test

1. Build Hugo Site

# Development mode
hugo server -D

Production build

hugo --gc --minify

2. Test Checklist

# Content tests
- [ ] Semua posts muncul
- [ ] Semua pages muncul
- [ ] Categories dan tags work
- [ ] Images load correctly
- [ ] Internal links work

Functionality tests

  • [ ] Search works
  • [ ] Navigation works
  • [ ] Pagination works
  • [ ] RSS feed valid
  • [ ] Sitemap valid

SEO tests

  • [ ] Meta titles correct
  • [ ] Meta descriptions present
  • [ ] Open Graph tags work
  • [ ] Twitter Cards work
  • [ ] Canonical URLs correct
  • [ ] Redirects work

Performance tests

  • [ ] Lighthouse score > 90
  • [ ] Page size < 1MB
  • [ ] Loading time < 3s

3. Compare dengan WordPress

Before/After Comparison:

# WordPress metrics (before)
Page size: 2.5MB
Load time: 4.2s
Lighthouse: 65/100

Hugo metrics (after)

Page size: 0.4MB Load time: 0.8s Lighthouse: 95/100

Step 8: Deploy

Deploy ke Cloudflare Pages

# .github/workflows/deploy.yml
name: Deploy Hugo
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest'
          extended: true
      - run: hugo --gc --minify
      - uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./public

DNS Configuration

  1. Update DNS Records
    – Point domain ke CDN (Cloudflare/Netlify)
    – Setup SSL/TLS
    – Configure redirects

  2. Test DNS Propagation

# Check DNS
dig yourdomain.com
nslookup yourdomain.com

Test dari berbagai lokasi

Gunakan tools: whatsmydns.net

Post-Migration Tasks

1. Update Search Engines

# Submit sitemap baru ke Google Search Console
# Check for crawl errors
# Monitor 404 errors
# Update robots.txt jika perlu

2. Monitor Traffic

# Check analytics untuk drop traffic
# Monitor 404 errors di console
# Fix broken links

3. Clean Up

# Backup WordPress files
# Export database untuk archive
# Cancel WordPress hosting
# Update bookmarks/documentation

Troubleshooting Migration

Issue: “Images Not Loading”

Solusi:

# Check image paths
grep -r "wp-content/uploads" content/

Fix dengan sed

sed -i 's|/wp-content/uploads/|/images/wp-content/|g' content/* /.md

Issue: “Broken Links”

Solusi:

# Find broken links
grep -r "http://olddomain.com" content/

Replace dengan new domain

sed -i 's|http://olddomain.com|https://newdomain.com|g' content/* /.md

Issue: “Comments Missing”

Solusi:
– Export comments ke JSON
– Convert ke static HTML
– Atau gunakan third-party service

Issue: “SEO Ranking Drop”

Solusi:
1. Pastikan redirects 301 benar
2. Submit sitemap baru
3. Request reindex di Search Console
4. Monitor 404 errors
5. Update internal links

Kesimpulan

Migrasi WordPress ke Hugo memberikan:

60-80% reduction dalam page size
3-5x faster loading times
Near-zero maintenance
Better security (no database)
Lower costs (free hosting options)
Version control untuk content

Timeline migrasi: 1-2 minggu untuk site medium (100-500 posts)

Ditulis oleh

Hendra Wijaya

Tinggalkan Komentar

Email tidak akan ditampilkan.