【2024年版】WordPressからmicroCMSへの記事移行方法
はじめに
タイトルの通り、記事の移行機能がmicroCMS側でまだ実装されていなかったので、プログラムを書いてWordPressからの移行を完了しました👌
そのプログラムや手順をこの記事で共有していきたいと思います!
前提事項
- microCMSにアカウント&サービスを作成していること。
- WordPressに記事があること。
- WordPressに保存されている画像URLを取得できること。
本記事ではWordPressの記事内の画像とサムネ画像に関してはmicroCMSに移行しておりません。
画像に関してはWordPressで設定されたパスのままサーバー内に保管して呼び出しております。
例:以下のパスのままサーバー内に保管して、microCMSから呼び出しています↓
https://www.lclco.com/wp-content/uploads/2023/07/IMG_8278-600x400.jpg
画像をmicroCMSに移行しなかった理由
①WordPressの画像が1万枚越えだったから。
②以下の例の通り、画像タイトルの前に一意のパスをmicroCMS側で振られるので、移行記事内の画像パスを全て書き換える必要があったから。
例:https://images.microcms-assets.io/assets/cfd43c0c9d5b40ed8c8694e03c10bd7d/b8c529f7943045368442aa85378ca181/画像タイトル.jpg
1. 記事移行前のmicroCMS側の準備
1-1. APIキーの設定
画像の通り、サービス設定のAPIキーの項目のGETとPOSTの項目にチェックを入れ、microCMS外からの記事の参照と追加ができるようにします。
1-2. APIスキーマの設定
画像の通り、APIスキーマを設定します。
※こちらのAPIスキーマは任意に変えていただいても問題ありませんが、以降に紹介する記事移行プログラムの該当箇所も同時に変えることを忘れないようにしてください⚠️
スキーマの内容↓
-
title(テキストフィールド)
- タイトル
-
contents(リッチエディタ)
- microCMSから投稿する記事の内容
-
thumbnail(画像)
- microCMSから投稿するサムネ画像
-
category(セレクトフィールド)
- カテゴリー
-
migrationThumbnail(テキストフィールド)
- WordPressから移行する記事のサムネ画像
-
migrationContents(テキストエリア)
- WordPressから移行する記事の内容
-
migrationPublishedAt(日時)
- WordPressから移行する記事の投稿日時
簡単に解説します↓
- migrationThumbnail
- 先述の通り、WordPressの画像はサーバー内に直接保管するのでそのURLを入れます。
- migrationContents
- 移行記事はHTMLなので、リッチエディタではなくテキストエリアに入れます。
- migrationPublishedAt
- 移行記事の投稿日時をこちらに入れ、フロントでソートできるようにします。
移行記事でない場合上記カラムが空になるので、カラム内容の有無で移行記事かmicroCMSから投稿された記事かを判別できます。
2. 記事移行前のWordPress側の準備
2-1. サムネ画像を出力するプラグインを入れてから記事をエクスポートする
プラグイン「Export media with selected content」を有効化して、任意の記事をエクスポートします。
詳細はこちらの記事を参考にさせていただきました🙏
2-2. エクスポートXMLファイルに名前を付けて保存
エクスポートしたXMLファイルに任意の名前を付けます。
例:blog.xml
3. 記事移行!
さて、ここまでで下準備は完了したので、プログラムを用いて記事を移行していきます!
今回はRubyのプログラムで作成しました。(Ruby3.1.4)
ファイル配置
プロジェクトルート/
│
├── blog_post.rb
├── blog.xml
移行プログラム
# ============================================================
# このスクリプトは、WordPressの投稿をMicroCMSに移行するためのものです。
# ============================================================
require 'net/http'
require 'uri'
require 'json'
require 'nokogiri'
def post_articles
uri = URI.parse("microCMSのpostするパスを入れてください") #TODO
header = {
'X-MICROCMS-API-KEY' => 'microCMSのAPIキーを入れてください', #TODO
'Content-Type' => 'application/json'
}
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
# XMLファイルを読み込む
doc = Nokogiri::XML(File.open("./blog.xml")) #TODO WordPressのエクスポート記事XMLファイル名を入れてください
request = Net::HTTP::Post.new(uri.request_uri, header)
successed_requests = []
failed_requests = []
# 各<item>要素について処理を行う
doc.xpath('//item').each do |item|
# <content:encoded>要素が空でない場合のみ処理を行う
if !item.at_xpath('content:encoded').text.empty?
# サムネイル画像のURLを取得
target_post_id = item.at_xpath('wp:post_id').text
img_item = doc.xpath("//item[wp:post_parent = '#{target_post_id}']")
thumbnail_url = if img_item.empty?
# デフォルト画像
'デフォルト画像のURLを入れてください' #TODO
else
img_item.at_xpath('wp:attachment_url').children.text
end
# カテゴリーの取得
categories = item.xpath('category[@domain="blog_cat"]').map(&:text)
category = categories[0]
# microCMSにpostする要素を変数に格納
title = item.at_xpath('title').text
contents = item.at_xpath('content:encoded').text
thumbnail = thumbnail_url
pub_date = item.at_xpath('pubDate').text
request.body = {
"title" => title,
"migrationContents" => contents,
"migrationThumbnail" => thumbnail,
"category" => ["#{category}"],
"migrationPublishedAt" => "#{pub_date}"
}.to_json
# postリクエストを送信
response = http.request(request)
case response
when Net::HTTPSuccess then
puts "successful!!! '#{title}'"
successed_requests << {title: title}
else
puts "failed... '#{title}'"
puts "Error message: #{response.message}"
failed_requests << {title: title, error_message: response.message}
end
end
end
return {total_successes: successed_requests.size, total_failures: failed_requests.size, failed_requests: failed_requests}
end
puts post_articles()
実行方法↓↓↓
ruby blog_post.rb
※ TODOの項目を埋めてから実行してください
プログラムの詳細はコード内コメントをご参考ください。
おわりに
WordPressからmicroCMSへの記事移行方法かなり悩んだので、その記録として本記事を執筆しました!
この記事がお役に立つことを祈っております👌
Discussion