古いWordPressから投稿IDを維持して記事インポート – 運営堂サイト裏話(1)

古いWordPressから投稿IDを維持して記事インポート – 運営堂サイト裏話(1)

2017年9月19日

独立時からずっとお世話になっている運営堂さんのサイトリニューアルのお手伝いをしました。
2011年には私がひとりでリニューアルを実施したのですが、今回はちゃんとプロジェクトチームを組んで、分業制で行いました。
おかげで私はWordPressまわりのことだけに集中できてとてもやりやすかったのですが、その中でもいくつか苦労した点や、他の案件ではまずやらないようなこともやったので、その部分を後学のために書き残しておきたいと思います。

1つ目は、「WordPressの記事を、投稿IDを維持してインポート」という点です。
まずは、なぜこういう要件になったかという説明から。

前提1:極力404を出さない

今回のリニューアルでは、URL設計にかなりこだわっています。
仕様策定を中心になって担当してくれたグランフェアズの藤田さんは、「URLは資産」だとおっしゃっていました。私も同感です。

運営堂さんのブログの一番古い記事は2007年4月。私自身はまだWordPressのワの字も知らず、ましてや仕事でウェブ制作もはじめていなかった頃です。
今回移行時点での投稿数は、固定ページやカスタム投稿を除いたブログ記事だけで1,640件。
これだけの長い運用歴と記事数を持つブログで404エラーを出すのがどれだけの損失になるのか、ブログ運用経験のある方ならきっと分かっていただけると思います。

ということで、ブログ記事についてはURLを現状と変えないことにしました。
元々のパーマリンク設定がpost_nameベースなら良かったんですが、そうではなく

/%post_id%.php

でしたので、URL維持のために、post_idもそのままにしておく必要があったのです。

※カスタム投稿タイプや、カテゴリーアーカイブなどのURLは、元々日本語が含まれていたのを今回英数字のみに揃えたいとのことで、URLは維持せず301リダイレクトをかけています。
これが結構な量になったわけですが、藤田さんが新旧URL対応表を作成&htaccessへの記述まで全部やってくれました。頭が下がります。。。

前提2:今回はクリーンインストール

正直、投稿IDを維持したいなら、現行サイトのデータベースをそのままDumpして新しい環境にインポートすれば良いわけです。プラグインやカスタムフィールドの情報などもすべてそのまま持っていけますし。
でも今回はそうせずに、クリーンインストールを選択しました。
理由は前述の通り、10年も運用しているブログだからです。これまでいろんなプラグインを入れたりやめたりしてきており、不要になったデータもたくさん残ってしまっています。
前回の2011年のリニューアルのときはテーマ変更しかしませんでしたので、やるなら今しかない!ということです。

ここまでが前提となる仕様です。
次に上記仕様を実現するための問題点など。

課題1:通常のエクスポート→インポートでは投稿IDが振り直しになる

投稿IDのことを考えなければ、WordPressデフォルトのエクスポート機能とWordPress Importerツールプラグインで良いのですが、この方法では投稿IDが変わってしまいます。

そこで、別の方法を使います。通常私が愛用しているプラグインセットはこちら。

ポイントとしては、インポートにReally Simple CSV Importer プラグインを使うということです。

hissyさんがお忙しいのか公式リポジトリの最終更新日が少し古いんですが、現行の4.8系でも問題なく動作します。
GitHubで公開もされているので、いざとなればForkも可能。これがOSSのよいところ。

現行サイトのエクスポートは、WP CSV Exporterプラグインを使います。
作者さんが(おそらく)Really Simple CSV Importerで使うために作った(であろうと思われる)ので、スムーズに移行できますし、なによりUIがわかりやすく、お気に入りです。

わかりやすいWP CSV ExporterプラグインのUI
▲WP CSV Exporterプラグインの操作画面

WP CSV Exporterだけだと投稿・固定ページのみの対応なので、カスタム投稿タイプをエクスポートするために、有償アドオン「WCE With Post Type」を購入しています。お値段は980円と良心的。(いま円安なので980円で買ったほうがお得ですが、ドルで買うと$9.8です)

ここまで、WP CSV ExporterとWCE With Post Type をオススメすべく紹介しました。
しかし実は今回、このプラグインが使えないという問題が発覚しました。。。

課題2:現行サーバのPHPバージョンが5.2系…

実はWP CSV ExporterプラグインはPHP5.2の環境では動作しません。(5.4以上で動くことを確認済み。5.3系は未確認)

スキルと時間があれば書き直すこともできるのかもしれないですが、私には無理と判断し、仕方がないのでPHP5.2でも動く代替プラグインを探しました。
いくつか類似のプラグインを試しましたが、インポート時に上手くいかなかったものもあり結構大変でした。
その中で、うまくいったのがこちらのプラグイン。

このプラグインだとカテゴリーは「名前」でエクスポートされるのですが、Really Simple CSV Importerでは、カテゴリーはスラッグで指定することになっているので、インポート前に置換が必要です。

なお、WordPress本体はまだPHP5.2.4以上なら動くのですが、プラグインレベルでは既に5.2系を切り捨てているものは多いです。他のプログラムとの兼ね合いもあるでしょうが、WordPressをお使いの場合、今後を考えると可能ならPHPのバージョンも上げていった方が良いです。
今回それができなかったので、サーバごと乗り換えとなったのですが。。。
(CPI 旧シェアードプランの情報がネット上に少なくその点でも一苦労。)

補足:新環境で先に固定ページとかカスタムメニューとか作っちゃダメ

投稿IDを維持してくれるかしこいReally Simple CSV Importerですが、インポート側で既に指定した投稿IDが埋まっているとその記事はインポートできません。
もう少し正確に言うと、インポート時に既存記事のpost_idとpost_typeのチェックを行っていて、CSVで指定したID・投稿タイプの組み合わせと、既存データのID・投稿タイプが異なる場合、上書きしないようになっています。かしこいですね!

で、インポート前に固定ページやカスタムメニューを作ってしまうと、インポート元の投稿のIDとかぶってしまうことがあります。
カスタムメニューの項目1つ1つは実は内部的にはカスタム投稿なので、投稿IDを消費してしまいます。

今回、インポートのことを忘れてつい先にカスタムメニューを作ってしまい、いくつかの記事がインポートできず、1回やり直しました。
この方法でインポートする場合は、インストール直後にやるようにしましょう。
作業中に記事が増えるだろうからあとでやろう、とか考えたらだめです。後日差分だけ再インポートしたほうがはるかに楽。

 

紆余曲折はありましたが、以上の手順で、なんとか無事にURLを維持して移行できました。
おかげで森野さんからは、(意図的に廃止したページ以外)Search Consoleで404が出ていないという嬉しい報告をいただきました。

プロジェクトの全体像については、運営堂さんのシリーズ記事をぜひお読みください。

運営堂サイトをリニューアルしました ‐ サイトリニューアル | 運営堂

9/1にサイトリニューアル、9/8に常時HTTPS化しました。 サーバが古かった…
www.uneidou.com