MovableTypeからWordPressに移行する方法

Movable type

これまでCMSとしてMovableTypeを利用してきましたが、OSのアップグレードと同時にWordPressに移行しましたので、その移行例をまとめておきました。今回はマルチサイト構成で運営しています。

WordPressのテスト環境の準備

MovableTypeとWordPressではコンテンツの管理方法が全く違います。MovableTypeは静的なコンテンツを生成し、WordPressは動的にコンテンツを生成します。このあたりの動きを確認するために、PCのDockerでWordPressを動かしてコンテンツの移行を試してみることにしました。

WordPressの初期設定はあちこちで紹介されていますので、ここでは省略します。また、今回はテストなので、httpsではなくhttpで動かしています。なお、画像の移行作業ぐらいからは本番サーバーに近づけるために、VMWareのUbuntuで作業を進めました。

MovableTypeの記事をWordpressにインポート

MovableTypeでエクスポートした記事データをWordPressにインポートするプラグインが提供されていますので、まずはこれを使ってみます。ダッシュボードのツールにあるMovable Type と TypePadインポーターをインストールして使いました。

Movable Type and TypePad Importer
Movable Type または TypePad から投稿とコメントをインポートします。

エクスポートしたデータ自体は問題なく取り込めましたが、これは記事だけですので、画像データをどうするかは別に考えないといけないようです。

テーマを設定する

ブログ用にテーマを設定します。Cocoonというテーマがよく使われているようなのでまずはこれにしてみました。なかなかかっこいい外観になりました。

Cocoon
SEO・高速化・モバイルファースト最適化済みのシンプルな無料Wordpressテーマ。100%GPLテーマです。

記事のURLを旧ブログと同じにする

これまでのMovableTypeでは以下のようなURLになっていました。

https://kanpapa.com/today/2023/11/mini-pupper-2-5-legs-assembly.html

ところがWordPressでは以下のようになってしまいました。

http://192.168.0.109:9080/2023/11/06/mini-pupper-2-5-legs-assembly/

これを修正するにはパーマリンクを設定します。管理メニュー→ダッシュボード→設定→パーマリンクのカスタム構造で以下のように設定します。

/%year%/%monthnum%/%postname%.html

この設定を行うことで、MovabelTypeと同じURLにできました。

http://192.168.0.109:9080/2023/11/mini-pupper-2-5-legs-assembly.html

画像ファイルのインポート

これまでのMovableTypeではサイトトップの直下にimagesというディレクトリを作り、その中に画像ファイルを格納していました。URLは以下のようになります。

https://kanpapa.com/today/images/MP2_5_leg_parts1.jpg

WordPressだとメディアライブラリにアップロードすると、以下のようにwp-contentのuploadsに年月ごとに格納されるようです。

http://192.168.0.109:9080/wp-content/uploads/2023/11/DVME_CPU2_board1.jpg

まずは、現在稼働しているサーバから画像関係のディレクトリをバックアップしたものをサーバー上にコピーして、以下の場所に配置しました。これでURLで直接アクセスができる状態になっています。

/var/www/html/wp-content/uploads/cosmac/images
/var/www/html/wp-content/uploads/cosmac/assets_c
/var/www/html/wp-content/uploads/today/images
/var/www/html/wp-content/uploads/today/assets_c

次に上記のディレクトリから、Add From Serverプラグインで画像データをメディアライブラリに一括インポートをしました。ファイル数が多く、一回ではできなかったので複数回に分けて行いました。

Add From Server
Add From Server is designed to help ease the pain of bad web hosts, allowing you to upload files via FTP or SSH and late...

このようにすることで、画像データは旧ブログに近いURLでアクセスもできますし、メディアライブラリにも存在する状態になります。旧コンテンツの画像URLは/wp-content/uploads/today/imagesに書き換えることで画像データのリンク切れを防ぎ、徐々にメディアライブラリの画像に入れ替えていく方法を取りました。

画像データのURLの書き換え

旧コンテンツの画像のコンテンツにアクセスするためには、記事中のURLを書き換えなければなりません。以下のようなソースがあった場合は

<p><a href="https://kanpapa.com/today/assets_c/2018/11/cosmac_book1-2970.html"><img fetchpriority="high" decoding="async" src="https://kanpapa.com/today/assets_c/2018/11/cosmac_book1-thumb-autox428-2970.jpg" alt="cosmac_book1.jpg" class="mt-image-none" width="320" height="428" /></a></p>

以下のようにURLを書き換える必要があります。

<p><a href="https://192.168.0.224/wp-content/uploads/today/assets_c/2018/11/cosmac_book1-2970.html"><img fetchpriority="high" decoding="async" src="https://192.168.0.224/wp-content/uploads/today/assets_c/2018/11/cosmac_book1-thumb-autox428-2970.jpg" alt="cosmac_book1.jpg" class="mt-image-none" width="320" height="428" /></a></p>

ここではサイト内のURLやテキストの一括変換を行えるSearch Regexプラグインを使いました。

Search Regex
Search Regex は、WordPress の投稿、ページ、独自の投稿種別、またその他のデータに対する強力な検索と置換機能を追加します。

インポート先のURLが4種類あるので、以下の4パターンについて置換を行いました。(テスト環境のため置換後はhttpになっています。)

検索文字列置換後
パターン1https://kanpapa.com/today/assets_c/http://192.168.0.224/wp-content/uploads/today/assets_c/
パターン2https://kanpapa.com/today/images/http://192.168.0.224/wp-content/uploads/today/images/
パターン3https://kanpapa.com/cosmac/assets_c/http://192.168.0.224/wp-content/uploads/cosmac/assets_c/
パターン4https://kanpapa.com/cosmac/images/http://192.168.0.224/wp-content/uploads/cosmac/images/

アンダーバーとハイフンの問題

WordPressに移行した記事をチェックしてみたところ、オリジナルのブログURLと今回作成したブログURLが異なることがあり、リンク切れがあることがわかりました。

旧ブログのURL https://kanpapa.com/today/2013/09/mbedlpc1114fn28.html
新ブログのURL https://192.168.0.224/today/2013/09/mbed_lpc1114fn28.html

MovableTypeではDBデータに含まれているアンダーバーがハイフンに自動変換されてURLが作成されているようです。移行先のWordPressではDBデータの値がそのまま使用されているようです。SEO的に記事のURLは保持したいところです。Regexで記事中のURLだけアンダーバーをハイフンに書き換えることができれば良いのですが、どうも記事中のURLだけを書き換えるのは難しそうです。そこでmySQLのデータを直接変更できないかを考えてみます。

WordPressのDBを修正する

mySQLAdminなどUIベースのツールを入れておくとDBの管理が楽なのですが、インストールしていないので、CUIで確認したところ、wp_2_postsテーブルのpost_nameとguid、wp_2_termsテーブルのslugでアンダーバーをハイフンに置換すれば良さそうです。まずは作業前には必ずmySQLのDBバックアップを行っておきます。

$ mysqldump -h localhost -u root -p --databases wordpress > wordpress_dump_12150722.sql

次にアンダーバーが含まれている記事のレコードを指定して確認します。

$ mysql -u root -p
Enter password: 
MariaDB [(none)]> use wordpress
MariaDB [wordpress]> select ID,post_name,guid from wp_2_posts where ID = 300;
+-----+-----------------------------+---------------------------------------------------------------------+
| ID  | post_name                   | guid                                                                |
+-----+-----------------------------+---------------------------------------------------------------------+
| 300 | passwordmaster3_311_leopard | http://192.168.0.224/today/2007/10/31/passwordmaster3_311_leopard/ |
+-----+-----------------------------+---------------------------------------------------------------------+
1 row in set (0.000 sec)

MariaDB [wordpress]>

試しにこの記事のURLにパッチをあててみます。

MariaDB [(none)]> use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [wordpress]> update wp_2_posts set post_name = 'passwordmaster3-311-leopard' where ID=300;
Query OK, 1 row affected (0.002 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [wordpress]> update wp_2_posts set guid = 'http://192.168.0.224/today/2007/10/31/passwordmaster3-311-leopard/' where ID=300;
Query OK, 1 row affected (0.002 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [wordpress]> select ID,post_name,guid from wp_2_posts where ID = 300;
+-----+-----------------------------+---------------------------------------------------------------------+
| ID  | post_name                   | guid                                                                |
+-----+-----------------------------+---------------------------------------------------------------------+
| 300 | passwordmaster3-311-leopard | http://192.168.0.224/today/2007/10/31/passwordmaster3-311-leopard/ |
+-----+-----------------------------+---------------------------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [wordpress]>

これで記事のURLに含まれたアンダーバーをハイフンに置換できました。今回は1件の記事だけにパッチを当てましたが、すべての記事にパッチを当てなければならないので、pythonでプログラムを書きました。

#!/usr/bin/python3

import mysql.connector

# データベースの接続情報を設定
db_config = {
    'host': 'localhost',
    'user': 'root',
    'password': 'xxxxxxxxx',
    'database': 'wordpress'
}

# MySQLに接続
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# 対象のテーブル名とカラム名を指定
table_name = 'wp_2_posts'
column_name = 'post_name'

# データの取得と変更
query = f"SELECT ID,{column_name} FROM {table_name}"
cursor.execute(query)

for row in cursor.fetchall():
	print(row)
	if '__' not in row[1]:
		# 変更するカラムのデータを取り出しアンダーバーをハイフンに置換する
		updated_value = row[1].replace('_', '-')

		# データの変更があるか?
		if row[1] != updated_value:
			print(row[1])
			print(updated_value)

    	    # Update record
    	    update_query = f"UPDATE {table_name} SET {column_name} = %s WHERE ID = %s"
    	    cursor.execute(update_query, (updated_value, row[0]))

# 変更をコミット
conn.commit()

# 接続を閉じる
cursor.close()
conn.close()

このプログラムを実行することで記事中のURLに含まれるアンダーバーはハイフンに置換できました。table_nameとcolumn_nameは以下のように指定して都度実行しました。

table_namecolumn_name
wp_2_postspost_name
wp_2_postsguid
wp_2_termsslug

カテゴリURLのリダイレクト対応

次にわかった問題はカテゴリのURLの違いです。旧サイトではトップの直下にカテゴリができています。

https://kanpapa.com/today/robot/mini-pupper-2/

WordPressでは以下のようにトップディレクトリの直下にcategoryがあり、その配下にカテゴリが配置されます。

https://192.168.0.224/today/category/robot/mini-pupper-2

旧サイトのURLにアクセスがあったら、新サイトのURLにリダイレクトしてあげれば良さそうです。リダイレクトを行ってくれるプラグインRedirectionで旧URLから新URLへのリダイレクトを行いました。今回の場合は以下のように設定しています。

ソース URL^/today/robot/(.*)正規表現、スラッシュ無視、大文字小文字の区別なし
ターゲット URL/today/category/robot/$1
グループ転送ルール

他の旧URLでも必要に応じてこのプラグインでリダイレクトを行っています。

残りは手修正で

ここまでの作業でほぼコンテンツにはアクセスできるようになりましたが、アイキャッチ画像の設定やカテゴリの見直しなど、まだ終わっていないところがあります。直近2年分については修正が完了していますので、残りのコンテンツは時間を見つけて修正を進めていきます。

タイトルとURLをコピーしました