いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。この記事は12月1日〜24日までに僕が毎日ブログを更新する高橋文樹俺ベントカレンダーの5日目の記事です。6日目ですが、昨日は忙しかったのでいまアップしています。なにか文句でも?WordPressには記事のインポートおよびエクスポートの機能があります。Importerというツールがあるので、これを使うのですが、いわゆる引越しやドメイン変更の場合などによく使われますね。この手順についてはたくさんあるのですが、困るのが「サイトAとサイトBをマージしたい」という場合です。このサイトが高橋文樹.comだったとして、高橋文樹ニュースというサイトをやっていたとしましょう。アクセスが少ないので、ニュースサイトを閉じましょうということになります。いえ、もったいないので、ニュースサイトの方の投稿のうち、「告知」と「メディア掲載情報」だけを高橋文樹.comのカスタム投稿タイプnewsにして、インポートしたいとかそういうことですね。この場合、気をつけなくてはいけないのは以下の点です。すべての投稿タイプが必要とは限らず、いるものといらないものがあるなんらかのカスタマイズを施しており、添付画像の投稿IDなどがカスタムフィールドに保存されているようするに、インポートするときにいろいろとカスタマイズしたいことがあるよね、というわけです。Importerの吐き出すXMLをちょっとカスタマイズするだけでなんとかなったりするので、その方法を説明します。変換はPHPスクリプトで行います。入力することで、求めるXMLを取得します。このファイルの中身はこんな感じです。名前空間が付いてしまうので、削除。やり方がよくわからなかった。Stuff!”とかいてあるところで投稿を表現するXMLノード$itemに対して操作を行えばいいんですね。具体的に何が必要かはケースバイケースなので、ありがちな操作を書いておきます。投稿タイプを取得&変更これは簡単です。postとpageおよびattachment(添付ファイル)以外の投稿タイプはいらないから削除し、ページを投稿にするケースを考えます。$index);}ポイントとしては、SimpleXMLが名前空間の扱いで謎の挙動を見せるということでしょうか。foreach内でやってしまうと、次のノードの取得に影響が出ます。イテレータ実装だからでしょう。したがって、削除すべきノードの番号を一旦配列に保存しておいて、あとから削除します。番号を大きい順に保存したのは、削除によって対象ノードが変わってしまうからです。unset($xml->channel->item[$index]);}ここら辺、もっとうまいやり方がありそうですが、とりあえずこんな感じで。カスタムフィールドを追加カスタムフィールドを追加するケースを考えてみましょう。今回は以前あった投稿IDをカスタムフィールドに保存しておくようにします。'wp');これで以前の投稿IDが_old_post_idとして保存されました。して保存しておけば、上述した「添付ファイルのIDがカスタムフィールドでひも付けられている」というようなケースでも問題ないでしょう。Importerがケアしているのかどうかはよく知りません。知っている人はコメントください。まとめというわけで、インポートする際にある程度事前処理をしておけば楽になります。移行後にバッチ処理を走らせる場合も、事前にカスタムフィールドなどでフラグを立てておけば楽になるでしょう。ポイントは......データの削除はちょっと面倒。更新と追加は割と簡単。インポート元のデータは全部エクスポートしてしまい、それから加工すると楽。添付画像の登録処理と紐付けは自分で作ると結構めんどくさいので、このツールに任せましょう。はじめに紹介した例の他に、大人の事情でサーバ管理者と入稿者とWordPress開発者が分断されている場合、入稿の準備ができてるのにサーバの準備ができませんなどという面倒くさい事情も考えられます。いうとき、便利ですね。