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

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の扱い

配列などの扱い

Comments

  • スパム対策のため、コメント本文にURLが含まれている場合は「承認待ち」となり、すぐに投稿が反映されません。ご了承ください。
  • 公序良俗に反する内容、個人が特定できる情報、スパム投稿と思われるコメント等については、予告なく編集・削除する場合があります。