WordPressでサイトをいくつかつくっているのですが、記事はカスタム投稿タイプを使い、データはカスタムフィールドにいれています。で、記事をアップするときにはCSV Importerというとても便利なプラグラインがあるのでCSVファイルで記事を流し込めるのですが、一旦投稿した記事を再び編集するにはどうすればいいのかと悩んでいました。
CSV Importerの対になるCSV Exporterというプラグインを探したのですが自分では見つけることができず、そんなとき、WordPressの管理メニューにはエキスポートという機能を発見しました。
ただ、こちらはデータがXMLファイル形式です。MS-EXCELを使えば表形式で読み込むことができるのですが、カスタムフィールドの値は同じ行に並ぶわけでなく、meta_keyとmeta_valueで2行になります。なので、カスタムフィールドが10個あればカスタムフィールドだけで20行になってしまうため、実際にこれをエクセルで編集するのにも非常に手間がかかり現実的ではありません。
しょうがないので、XMLファイルをCSVファイルに変換するPHPを書いてみました。ちなみに、はまった箇所はここ!
$xml = file_get_contents('001.xml'); $xml = htmlspecialchars($xml); $xml = str_replace('wp:','wp',$xml); $xml = htmlspecialchars_decode($xml); $xml = simplexml_load_string($xml);
- WordPressからエクスポートされるXMLファイルには、”WP:”のように”:”がはいっているため、simplexml_load_fileでみるとこの部分が消えてしまう。
- なので、file_get_contentsをすると、今度は ”<”とかが消えてしまう。
- 結局、上記のとおり、htmlspecialcharsをしてからstr_replaceをして、htmlspecialchars_decodeすることで解決しました。
ただ、初心者プログラマーなので、下記の問題があります。
- titleとカスタムフィールドしか変換していないです。
私の場合は、カスタムフィールドしか必要が無いので このような仕様になっています。 - 列がずれます
カスタムフィールドがnullのpostがあると、列がずれます。そこらへん、meta_keyを配列のキーにして作り直せばおそらく修正できると思うのですが、とりあえず現状はこんな感じです。 - カンマがあると別の列になります。
自分は緯度経度をカンマで区切ったデータがあるのですが、見事に別の列になってしまいました。これもきっと改善できると思うのですが、現状はこんな感じ。
ということで、だめなところ満載のコードですが、今まで逃げていたXMLからCSVファイルをつくる第一歩を踏み出すことができました。
ちなみに、プログラマーの先輩型からのアドバイスをいただけると、すごくうれしいなぁと。
では!
これが今回書いたコードです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>001.xmlを100.csvに変換する</title> </head> <body> <?php $csvFile = '100.csv'; $xml = file_get_contents('001.xml'); $xml = htmlspecialchars($xml); $xml = str_replace('wp:','wp',$xml); $xml = htmlspecialchars_decode($xml); $xml = simplexml_load_string($xml); # CSVファイルに書き出すデータを用意する $csvData = ''; foreach ( $xml->channel->item as $item ) { $title = $item->title; $csvData .= $title.','; foreach ( $item->wppostmeta as $postmeta ) { // $csvData .= $postmeta->wpmeta_key.','; $csvData .= $postmeta->wpmeta_value.','; } $csvData .= "end \n"; } # ファイルを追記モードで開きます。 $fp = fopen($csvFile, 'ab'); # ファイルをロックします(排他的ロック)。 flock($fp, LOCK_EX); # ファイルの中身を空にします。 // 追記する場合はこの処理は不要 ftruncate($fp, 0); # データを書き込みます。 fwrite($fp, $csvData); # ファイルを閉じます。 fclose($fp); ?> </body> </html>