XML エクスポート機能を使って WordPress の引越しをしたらうまくいった、という話をしたばかりですが、先ほどちょっとした問題を見つけてしまいました。
このブログでは個々のエントリーのパーマリンクに
http://www.miyoshitakayuki.com/archives/123
という構文を長い間使ってきました。最後の数字の部分でエントリーが特定される仕組みです。この数字はエントリーの ID から来ています。
問題というのは、エクスポートされたデータにこの ID が含まれておらず、つまりインポートの際に ID が1から振り直されることになり、要するにその過程で一部のエントリーの ID が変わってしまいました。
その結果、過去のエントリーのパーマリンクも振り直された ID に合わせて変わってしまい、するとどうなるかというと、よそのサイトからエントリーのパーマリンクにリンクされていたのがリンク切れになったり、はたまた別のエントリーのページにリンクされてしまうというわけです。
…まいったね。まあ、やっちゃったものはしょうがないんで今回のことは気にしないことにしますが、XML エクスポートにはそういう副作用がありますよ、ということは心に留めておいた方がいいかもしれない。
今後のことについてはいくらか考えることがあります。エクスポートデータに ID が含まれないのは欠陥なのか? そういう疑問も考えましたが、欠陥ではないような気がしてきました。エクスポートは DB のバックアップではないので、DB 上の ID に拘束される必要はないはずです。
ほかの方法で対処を考える必要があるんじゃないか? XML でエクスポート/インポートするたびにパーマリンクの変更が起こりうる、というのでは困ってしまいます。むしろ問題はパーマリンクの振り方にあるんじゃないかと思えてきました。そもそも、DB 上のレコードの識別キーに過ぎない ID を、パーマリンクの要素として使っていること自体が、そもそも間違いではなかったか。
パーマリンクの構文を変えることはいくらでも可能です。別に ID を含める必要はない。たとえば良く使われるのが次のパターン
http://www.miyoshitakayuki.com/2006/10/22/sample-post/
エントリーの作成年月日とポストスラッグ(post slug)で構成されている。ポストスラッグはエントリーのコードネームみたいなもので、URL の中で使えるような英数字と記号で構成されます。
ポストスラッグは自分で設定してもいいけど設定しなくても WordPress が自動的に決めてくれるもので、たとえばその日エントリーのタイトルが「Austin Powers — The Spy Who Shagged Me」だったら「austin-powers-the-spy-who-shagged-me」みたいにスペースをハイフンで埋めた文字列を提示してくれるので、そのまま保存すればいい。別に手間はありません。
タイトルが英語だったらこれでいい。日本語だったらどうなるか? 日本語の場合はタイトルが URL エンコードされた文字列がポストスラッグとして提示されます。だからたとえばタイトルが「オースティン・パワーズ♂」だったら、ポストスラッグは「%e3%82%aa%e3%83%bc%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%83%bb%e3%83%91%e3%83%af%e3%83%bc%e3%82%ba%e2%99%82」。こんな長いのが毎回毎回 URL のケツにくっついてくるなんてうんざりするよね。
URL エンコードのポストスラッグはさまにならない。といって毎回アルファベットのポストスラッグをつけるほどマメじゃない。だからパーマリンクの構文にはポストスラッグを避けて ID をつかってきたけれど、XML エクスポートではそれが問題になってしまった。ああ困った。
回避策。URL エンコード以外のポストスラッグを提示するように WordPress を変更してみたらどうだろう。たとえばタイトルとは無関係に、エントリー作成日を元にして「22-october-2006-1」みたいに (これは単にデフォルト値だから変えたいなら「austin-powers」に変えてもいい)。これならプラグインを作って実現できるかもしれない。
でもいまパーマリンクの構文変えたら既存のリンクは全部だめになったりするかもしれないな。過去の遺産も残すように配慮しないと。