Shift JISのCSVをWordPressにインポート
2012年9月21日
他のDBからWordPressにデータをインポートしようとしたのですが、データ加工が必要でした。
そのため、DBからデータをCSVにエクスポートし、Excelで加工しました。
その後、WordPressに加工したCSVをインポートしようとしました。
プラグインでインポート
CSVにインポートするプラグインはCSV Importerのようですが、どうやら文字コードをUTF-8にする必要があるようです。
Excelで操作できるCSVはShift JISですし、環境によって文字化けする場合があるようです。
とすると、プラグインをカスタマイズする必要がありそうですね。
CSV Importerをカスタマイズ
入力のCSVがSJISのため、内部でUTF-8に変換するといった処理となるはずです。
調べた結果、PHP自体のCSVをパースする関数に、制限があるようでした。
※上記2サイトは大変参考になりました。
ということで、CSV ImporterのFile_CSV_DataSource/DataSource.phpのparse()を以下のように修正します。
/**
* csv parser
*
* reads csv data and transforms it into php-data
*
* @access protected
* @return boolean
*/
protected function parse()
{
if (!$this->validates()) {
return false;
}
$buf = mb_convert_encoding(file_get_contents($this->_filename), 'UTF-8', 'sjis-win');
$res = tmpfile();
fwrite($res, $buf);
unset($buf); // 一応
rewind($res);
$current_locale = setlocale(LC_ALL, '0'); // 現在のロケールを取得
setlocale(LC_ALL, 'ja_JP.UTF-8');
/* $c = 0; やめます */
$d = $this->settings['delimiter'];
$e = $this->settings['escape'];
$l = $this->settings['length'];
/* $res = fopen($this->_filename, 'r'); */
while ($keys = fgetcsv($res, $l, $d, $e)) {
$this->rows[] = $keys;
/* if ($c == 0) {
$this->headers = $keys;
} else {
array_push($this->rows, $keys);
}
$c ++; */
}
if (count($this->rows) > 0) {
$this->headers = array_shift($this->rows); // ループの外に出す
}
setlocale(LC_ALL, $current_locale); // ロケールを戻す
fclose($res);
$this->removeEmpty();
return true;
}
参考にした2サイトの処理を考慮しつつ改造しました。
アップロードされたファイルをsjis-winからUTF-8に変換し、一時ファイルを作ります。
ロケールを念のため取得して戻しています。
ループ の中で1回だけの判定のような処理はループ外に出します。
一応基本的な動作とカスタムフィールドのインポートも大丈夫でした。