WordPressのwpForo Forum（掲示板プラグイン）を解析して旧サイトから移行してみた

#１．はじめに
もともと20年ほど旧サイト「[らららのプログラマーズラウンジ](http://rarara.cafe.coocan.jp/)」を運営していたのですが、XServer,WordPressのサイトへ引っ越ししました。これを機に（いまどき？になりますが）CGIの掲示板からWordPressのwpForo Forum（掲示板）へ移行しました。

（移行先は、[こちら](https://rarara.org/community/)です。6万件弱の書き込みが移行されたことが確認できます）

[![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/1fa6b9d3-2cd1-c6dd-258d-17ea064e5782.png)](https://rarara.org/community)

　旧サイトは約20年ほどの掲示板書き込みデータがあり、もちろんそのデータを移行する必要があるのですが
　標準で移行方法が用意されておらず、自力で「wpForo Forum」を解析して移行しました。
　ゆうて掲示板だし「**眺めれば、なんとかなるっしょ♪**」と軽いノリでやってみた。
　と、そういう記事です。

　ちなみに、Qiitaでちょっと「wpForo」を検索してみたところ1件もヒットしない！
　WordPressはあってもwpForoは1件もないかｗ　ということで需要はないのはわかりましたが、
　私のように（あまりいない）掲示板移行したい方向け、そして自分用のメモとして記事にしておきます。

#２．移行元と移行先の掲示板について

##掲示板（移行元）
移行元の掲示板は、「[とほほのＷＷＷ入門] (http://www.tohoho-web.com/)」で配布されている「[WwwLounge - CGI質問掲示板](http://www.tohoho-web.com/wwwboard.htm)」です。
約20年ほど前に配布され、今は更新されていないCGI掲示板です。
当時は設置している方もちらほら見られて、知っている人は知っている掲示板でした。
　
書き込みデータは、ほんとテキストのログです。
データはこんな感じです。

```
Subject: WEB質問ラウンジ設置！
========================================
From: ららら
E-Mail: rararahp@cool.ne.jp
HomePage: http://rararahp.cool.ne.jp
Date: 2002/06/01(土) 02:28:34

こんにちは。らららです。

WEB用ラウンジを設置しました。
みなさん、ご活用くださいませ。m(_ _)m
========================================
From: ｘｘｘ
Date: 2002/06/03(月) 12:36:42

新規ラウンジ解説、おめでとうございます。
ところで、ASPの設置予定はないのでしょうか？
========================================
From: ｘｘｘ
Date: 2002/06/03(月) 17:34:41

こんにちは。ASPはHP作成に関わることなので、
このラウンジでよいんじゃないですかねぇ。
```

##掲示板（移行先）
移行先の掲示板は、冒頭で書いたようにWordPressのプラグイン「[wpForo Forum](https://ja.wordpress.org/plugins/wpforo/)」です。
「wpForo」はWordPressの掲示板プラグインの中でも優れている機能を持っていて実は、他の掲示板からの[移行ツール](https://wpforo.com/docs/root/migrate-to-wpforo/)が用意されています。

![migrationtool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/fdfdd7aa-95ad-e81f-8483-cb9e03bf18ca.png)
　画像
　https://wpforo.com/docs/root/migrate-to-wpforo/

しかし「phpBB」や「MyBB」等の有名どころからの移行ツールは用意されているのですが
むかーしの日本のローカルでしか使われていなかった「WwwLounge」からの移行ツールはもちろん用意されていません。

**しゅーりょー**である😭。。。

<font color="Red">いや。待て待て。わいエンジニア！</font>💪
ちょっと眺めれば、掲示板データの移行なんて楽々いけるでしょ！
ということでやってみた。

#３．wpForoの解析（完全に理解した。してない）

では、移行に向けてwpForの解析を始めます。
と言っても眺めるだけです🤣

wpForoには[ドキュメント（英語）](https://wpforo.com/documentation/)はあるのですが、
ぱっと見、移行ツール以外に有用な情報はなさげ。

フォーラムで書き込まれたテキストはどこにいくか？
WwwLoungeみたいにテキストファイルってことはなくデータベースでしょう。
ということで、MySQL管理ツールのphpmyadminからデータベースを覗くとそれっぽいものがありました。
![table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/68399549-0116-1b49-9987-801d033538bd.png)

名前が「wp_wpforo_」から続くテーブルがそうですね。

次にテーブルの定義やデータを眺めます。
（眺めるというのは、テーブル名前、項目名から意味を想定して、実際に掲示板から書き込みをしてみて、どのようなデータが生成されるかを確認する地道な作業。。。🤣）


と、すると移行にはこのあたりのテーブルをなんとかすれば良いことがわかります。

wp_wpforo_forums：各掲示板の情報
wp_wpforo_topics：投稿（ヘッダ）
wp_wpforo_posts：投稿（明細）
wp_wpforo_tags：タグ
wp_users：ユーザー (WordPressと共通）
wp_wpforo_profiles：ユーザーのプロファイル

wp_wpforo_topicsとwp_wpforo_postsが書き込みデータで
スレ主がスレッドを立てるとwp_wpforo_topics、wp_wpforo_postsがそれぞれ１件出来て、
レスをつけるとwp_wpforo_postsが１件づつ増えていく関係です。

それぞれの項目の意味はこんな感じです。
・wp_wpforo_topicsテーブル
・wp_wpforo_postsテーブル
![tableddl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/8c027195-d39e-c9f7-8c2d-eaeab99d29f1.png)
※必要なテーブルの項目は、すべてどのような意味か、データ値はどんな形式で何が入るかを洗い出します。掲示板で使っていない機能とかがあるとデータに変化が現れずわからない事もあるのですが、大体解析しました。

#４．移行方針決定

移行方針は、事前にWordPressからサブフォーラムの作成など大まかな掲示板の設定を行い、
移行元掲示板からデータを抽出して、移行先掲示板にインポートしてあげます。これだけで動くはず！

##移行元掲示板（WwwLounge）からのデータエクスポート
上記にも書きましたが、投稿はテキストファイルなので、このテキストファイルを解析して読み込むプログラムを自作します。
SubjectやDateなど特定キーワードや規則的な順序性があるので、これに基づいて読み込みます。

##移行元→移行先へデータを変換
移行元からのエクスポートをしたデータをwpForoの形式に変換するプログラムを自作します。
（どのように変換するかは「wpForoの解析」のところで把握した構造になるように変換します）

★実際の抽出、変換プログラムはこちら
[https://github.com/rararalounge/LoungeTool](https://github.com/rararalounge/LoungeTool)

##移行先掲示板（wpForo Forum）へのデータインポート
インポートには、phpmyadminにインポート機能があるのでこれを使います。
以下のようにインポートするファイルのフォーマットを指定できます。
今回は、CSVにしています。
（XMLのほうが後々良いかなと思いましたが、1回インポート出来ればいいしCSVのほうがとりあえずなら簡単かなと。安易な選択）

またCSV読み込み時にやっかいな、カラムの区切り文字や囲み記号エスケープ記号などをインポート画面から指定できます。便利！
![インポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/a817e0af-c312-7bb1-06aa-badac10c8726.png)

#５．移行実行
ここまでくれば、あとはインポートして「<font color="red">めでたしめでたし！</font>」のはずなんですが、実際インポートすると以下のようにエラーが出たり、インポートが成功しても想定していなかった問題が発生したりとです。
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/d825a0e2-2d62-5c26-7dbe-b3f1f53be037.png)

解析があまかったり、データが思うように出来ていなかったりといった事が原因ですね。トライアンドエラーを繰り返すしかねぇ！
いくつか対応したのですが、覚えているのだと以下のような問題が出ました。
（もっと問題が出た気がしますが、忘れてしまいました）

##問題１
問題１ Q＆AのURLがなぜか重複する

wpForoの仕様で、質問をすると以下のようにタイトルがそのままURLに使われます。
（例）
「[https://rarara.org/community/programming/コードで作成したコントロールのイベントハンドラー](https://rarara.org/community/programming/コードで作成したコントロールのイベントハンドラー)」

ただこのURLの長さに最大制限があって途中で切り取られます。普通に使う分には重複すると連番(ハイフンと数字）が付与される仕様なので問題ないのですが、私のように移行プログラムでインポートしようとしたところユニークチェックにひっかかって大量にエラーが出ました。

タイトルに
「コードで作成したコントロールのイベントハンドラー１」
「コードで作成したコントロールのイベントハンドラー２」
「コードで作成したコントロールのイベントハンドラー３」
というように連番をついている場合や
「コードで作成したコントロールのイベントハンドラーでエラー発生」
というようにタイトルが途中までが同じ場合です。。。

これは変換プログラムを修正して、重複したらURLに連番をつけるようにして対応しました。

##問題２
問題２ 検索文字列をURLエンコードしてくれない

これはwpForoのバグなのですが、例えばサイドバーからタグ「C#」と検索しても#がURLエンコードされておらず正しく検索出来ない。

###公式サイトへの修正依頼
とりあえずwpForoはPHPで出来ているのでソースコードを眺めて、修正箇所を見つけて対応しました。ただプラグインがバージョンアップした際に自分が行った修正が消えてしまうのが面倒だなぁと思ったので、wpForoの公式にサポートがあるので以下のように修正依頼を行いました。

![依頼.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/7aa02359-1c7a-8f64-9202-433fdf2dd905.png)

返答はその日のうちにありました。はやい！
回答としては、「そのバグは知っている。次のバージョンで修正する予定」とのこと。

##おまけに
移行先の掲示板では、ユーザー登録制（登録しなくても投稿と書き込みは可能）なのですが、ユーザー登録していると投稿数に応じて以下のように貢献度がわかるちょっとだけうれしい仕様です。
![profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175210/7f024dfd-7a6a-2396-6170-e32961ac39bf.png)

昔から書き込んでくれているユーザーと、移行した掲示板ログをひもづけるために以下のように直にSQLでデータをいじって対応したりしています。（ユーザー登録して頂いた方のみですが）

```
UPDATE `wp_wpforo_topics` SET name = "", email="", userid = ユーザーID WHERE name = "ユーザー名"
UPDATE `wp_wpforo_posts` SET name = "", email="", userid = ユーザーID WHERE name = "ユーザー名"
```
（上記のSQLは、過去のユーザー名（文字列）で検索して登録したユーザーへの置き換え）
※一応、解析でテーブル構造を把握しているからこそ、こんな対応もできる。

#６．さいごに
エンジニアだから、**存在しないんだったら（今回は移行ツール）自分で作れば良い**ですね。
エンジニアとかたいそうなものじゃなくて、今回のように**どのように解決するかの思考**と**プログラムがちょっと書ける**ぐらいで大丈夫！

あと、移行先の「[らららのエンジニアラウンジ](https://rarara.org)」
移行前よりさらにアクセスが減っているような。。。引っ越ししたばかりで検索にヒットしにくいというのはあるかもしれませんが。
いまどき掲示板は難しい（チャットやTwitter等と比べて）のはわかっておりますが、みなさんのノウハウが参照できる形でずっと残るという意味ではとても有用だとと思っています。現に約20年分の技術Q＆Aのログが本サイトには残っています。

ということで[当サイト](https://rarara.org)にアクセスして頂けると喜びます！🙇🙇🙇

また私としては<font color="red">Qiita初投稿</font>でした。勉強になりました。そしてこのしくみ便利だぁー。