👌

【2024年版】WordPressからmicroCMSへの記事移行方法

2024/08/23に公開

はじめに

タイトルの通り、記事の移行機能が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」を有効化して、任意の記事をエクスポートします。
詳細はこちらの記事を参考にさせていただきました🙏
https://wplabo.net/export-media-with-selected-content/

2-2. エクスポートXMLファイルに名前を付けて保存

エクスポートしたXMLファイルに任意の名前を付けます。
例:blog.xml

3. 記事移行!

さて、ここまでで下準備は完了したので、プログラムを用いて記事を移行していきます!
今回はRubyのプログラムで作成しました。(Ruby3.1.4)

ファイル配置
プロジェクトルート/

├── blog_post.rb
├── blog.xml

移行プログラム

blog_post.rb

# ============================================================
# このスクリプトは、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()

実行方法↓↓↓

terminal
ruby blog_post.rb

※ TODOの項目を埋めてから実行してください
プログラムの詳細はコード内コメントをご参考ください。

おわりに

WordPressからmicroCMSへの記事移行方法かなり悩んだので、その記録として本記事を執筆しました!
この記事がお役に立つことを祈っております👌

LCL Engineers

Discussion