はてなダイアリーのXMLをパースしてCSV形式で出力しWordPressにインポートする

2017-12-26 1:35
WEB

目的

はてなダイアリーに書いた記事を、はてな記法のままWordPressにインポートする

やりかた

  1. ダイアリーの管理画面から「はてなダイアリー形式」のxmlをエクスポート
  2. xmlをパースしてCSVに変換
  3. WordPressプラグイン「Really Simple CSV Importer」を使ってインポート

XMLをパースしてCSVに出力するPHPプログラム

材料

  • index.php
  • download.php
  • hoge.xml
    • はてなダイアリーのエクスポートデータ

ソース

index.php
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>はてなダイアリーのXMLをパースしてCSVで出力する</title>
</head>
<body>
	<?php
	/* 配列の見出し列を作成 */
	$entries[] = array(
		"post_id",
		"post_name",
		"post_author",
		"post_date",
		"post_type",
		"post_status",
		"post_title",
		"post_content",
		"post_category",
		"post_tags",
		);

	/* はてなダイアリーのXMLをパース */
	$xml = simplexml_load_file('hi3103.xml');
	$json = json_encode($xml);
	$array = json_decode($json,TRUE);
	$days = $array["day"];
	foreach($days as $day){
		//dayタグのdate属性の内容を取得
		$attr = $day["@attributes"];
		$date = $attr["date"]; //yyy-mm-dd
		$date = date('Y/n/j G:H',strtotime($date)); // yyyy/m/d 0:00 形式にする

		//bodyタグの内容を取得
		$body = $day["body"];

		//bodyタグの内容を見出しごとに分割して配列に格納
		$body = preg_split('/\*([0-9]{10})\*(.*?)\n/', $body, null, PREG_SPLIT_DELIM_CAPTURE);

		//bodyから記事IDを取得
		$id = $body[1];

		//bodyからタイトル行を取得
		$meta = $body[2];
		//タイトルとタグを分割して配列に格納
		$meta = preg_split('/\[|\]/', $meta, null, PREG_SPLIT_DELIM_CAPTURE);
		//配列の中の空要素を削除する
		$meta = array_filter($meta, "strlen");
		//添字を振り直す
		$meta = array_values($meta);
		//配列から最後の要素を削除&削除した要素をtitleに格納
		$title = array_pop($meta);
		//残った配列をカンマ区切りの文字列としてtagに格納
		$tag = implode(',', $meta);

		//bodyから本文を取得
		$content = $body[3];

		//配列に格納
		$entries[] = array(
			// "post_id"		=> 
			null,
			// "post_name"		=> 
			null,
			// "post_author"	=> 
			'hi3103',
			// "post_date"		=> 
			$date,
			// "post_type"		=> 
			'post',
			// "post_status"	=> 
			'draft',
			// "post_title"	=> 
			$title,
			// "post_content"	=> 
			$content,
			// "post_category"	=> 
			'hatena_diary',
			// "post_tags"		=> 
			$tag,
			);
	}

	/* CSVファイルを出力*/

	// ファイル名を日付から生成
	date_default_timezone_set('Asia/Tokyo');
	$filename = "hatena-diary-".date("YmdHis").".csv";

	// ファイルポインタをオープン
	$fp = fopen($filename, 'w');

	//配列からcsvファイルへの書き込み
	foreach ($entries as $fields) {
		fputcsv($fp, $fields);
	}

	// ファイルポインタをクローズ
	fclose($fp);
	?>

	<p><?php echo $filename; ?></p>

	<form method="post" action="download.php">
		<input type="hidden" name="filename" value="<?php echo $filename; ?>">
		<input type="submit" value="ファイルをダウンロード">
	</form>

</body>
</html>
  • ダウンロードボタンをクリックするとdownload.phpが走る
download.php
<?php
if($_SERVER['HTTPS']=='on'){
	$filename = $_POST['filename'];

	// HTTPヘッダを設定
	header('Content-Type: application/octet-stream');
	header('Content-Length: '.filesize($filename));
	header('Content-Disposition: attachment; filename='.$filename);

	// ファイル出力
	readfile($filename);

	// ファイル削除
	unlink($filename);
}
?>
  • ファイルのダウンロードと削除を行う

参考URL

simpleXMLの扱い

配列などの扱い