logo
コーディング

投稿日

WordPressからmicroCMSにデータを移行する方法

Webクリエイターボックスは2024年11月にWordPressからmicroCMSに移行しました。いろんな方法がありますが、microCMSではCSVでのインポートが可能なので、WordPressでXMLデータをエクスポートして、PythonでCSVに変換して移行した手順を紹介します。

ざっくりとした移行手順

  1. WordPressのコンテンツデータをエクスポート
  2. microCMSのAPIを設定する
  3. PythonでWordPressデータ(XML)からCSVデータに変換
  4. microCMSの管理画面からCSVデータをインポート

1. WordPressのコンテンツデータをエクスポート

WordPressの管理画面で、[ツール]→[エクスポート]から、必要なコンテンツを選択し、「エクスポートファイルをダウンロード」ボタンをクリックします。この画面ではすべての投稿をエクスポートしています。

しばらくするとXML形式のファイルがダウンロードされます。WordPress側の操作はこれでおしまい。

2. microCMSのAPIを設定する

続いて、microCMSの管理画面で、APIの設定をします。今回は「読んだ本」コーナーの記事を移行していったときを例に紹介します。

  • title(タイトル)
  • review(レビュー文)
  • url(販売サイトリンク)
  • author(著者)
  • publishedDate(発売日)
  • category(カテゴリー)

こんな感じのAPIスキーマ(データの構造のこと)を用意しておきました。

3. PythonでWordPressデータ(XML)からCSVデータに変換

microCMSはCSV形式のデータをインポートできるので、XML形式のWordPressのデータを変換する必要があります。今回はPython(パイソン)を使って変換しました。

Pythonは、読みやすい文法と豊富なライブラリが特徴のプログラミング言語です。人工知能やデータ分析、Web開発など、幅広い分野で活用されているため、世界中で人気を集めています。

とは言え、一から勉強し始めるのも時間がかかっちゃうので、サクッと必要なデータ部分だけ抽出してCSVの各セルに入れ込むっていうプログラムを書いちゃいました。

まずはPythonの環境設定

Python公式サイトからPythonをダウンロードし、インストールします。エディターのVSCode(Visual Studio Code)を使用する場合はMicrosoft公式の拡張機能「Python」があるので、インストールしておきましょう。

XMLのデータをCSVへ

XMLのデータから必要な文字列を抽出して、CSVの任意のセルに登録する…って作業をしていきます。

WordPressで書き出したXMLファイル(book-wp.xml)を読み込んで、出力ファイルの列名を指定しておきます。2.で設定したmicroCMSのフィールドIDですね。1列目にはmicroCMSの各記事に割り振られる用のコンテンツIDを用意しておきます。

そしてCSVファイルに書き込むための指示をしていきます。XMLファイルにある <item> タグの中に各記事が内包されているので、必要な文字列を抽出します。例えばタイトルなら

<item>
	<title><![CDATA[超明快 Webユーザビリティ ―ユーザーに「考えさせない」デザインの法則]]></title>
	<!-- その他なんやかんや -->
</item>

のように書かれている部分の <title> タグから <![CDATA[]]> で囲まれている部分のみ抽出したいので、Pythonでは、

title = item.find('title').text
data["title"] = title.replace('<![CDATA[', '').replace(']]>', '')

こんな感じで書き換えていきます。他の項目も同様に、条件があれば条件を加えながら、以下の感じでPythonファイルを作成。

import xml.etree.ElementTree as ET
import csv
from datetime import datetime

# XMLファイルの読み込み
tree = ET.parse('book-wp.xml')
root = tree.getroot()

# 出力ファイルの列名
headers = ["コンテンツID", "title", "review", "url", "author", "publishedDate", "category"]

# CSVファイルに書き込み
with open('bookdata-output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=headers)
    writer.writeheader()

    # <item> タグごとに情報を抽出
    for item in root.findall('channel/item'):
        data = {}

        # コンテンツID
        link = item.find('link').text
        content_id = link.replace('<https://www.webcreatorbox.com/book/>', '')
        data["コンテンツID"] = content_id.zfill(3)  # 3桁にゼロパディング

        # title
        title = item.find('title').text
        data["title"] = title.replace('<![CDATA[', '').replace(']]>', '')

        # review
        review = item.find('{<http://purl.org/rss/1.0/modules/content/>}encoded').text
        data["review"] = review.replace('<![CDATA[', '').replace(']]>', '')

        # URL, Author, Published Date, Category も同様に・・・長くなりそうなので割愛

        # 書き込み
        writer.writerow(data)

これをターミナルから実行すれば、1秒後にはCSVファイルが完成します!やったね!

4. microCMSの管理画面からCSVデータをインポート

あとはmicroCMSの管理画面へいき、目的のコンテンツ(API)からCSVをインポートします。このとき、コンテンツがひとつでもあればインポートできないみたいなので、テスト投稿なんぞあればすべて削除してからインポートしましょう。

また、一度にインポートできる項目数はプランによるみたいなので、こちらも事前に確認しておくといいですね。

ひとまずできた!

とりあえずインポートできて満足!ですが、今回のやり方だと

  • Pythonの基礎知識が必要
  • 画像の登録はできない
  • リンクテキスト等のリッチコンテンツにはもう少し加工が必要

などなど、懸念点もあります。また、元のデータがどんなものかによってもうひと工夫しないといけません。

データを移行するには他にもいろんな方法があります。自分の状況にあわせて試してみてくださいね!