Mac って何?それって美味しいの?

マイコンと呼ばれた時代から現在まで、使用記から何から何でも。

FacebookからWordPressへの引っ越し(JSONファイル編)

 

yummac.hatenablog.jp

 FacebookからエクスポートしたJSONファイル、最初は何もわからず(資料がないんだもん)、データ構造を解析して投稿を抽出していました。
その後のGraphAPIでは、リファレンスが用意されており、またGraphAPIエクスプローラを利用することで、データ構造を確認しながら開発しました。
エクスポートしたJSONファイルのデータ構造と、GraphAPIで取得できるデータ構造、異なる部分もありますが、わかってしまえばそんなに苦ではありませんでした。

データの取得は、file_get_contentsでJSONファイルを読み込む。
日本語デコード("\u00xx")は正規表現で置換する。(正規表現ちんぷんかんぷんですが)
データの階層の違い、attachments構造の違いに合わせコーディングする。
画像や動画は、Facebookからエクスポートしたファイルを解凍し、フォルダごとWordPressのuploadsにアップロードしておく。投稿データのattachmentsをもとに、メディア登録する。

 

//実行時間制限延長(秒) 0は無制限 このスクリプトのみ有効
$maxtime = 3600;
ini_set("max_execution_time",$maxtime);

// アップロード用ディレクトリのパスを取得。
$wp_upload_dir = wp_upload_dir();

//Facebook jsonfile
$jsonfile = 'wordpress uploads下にアップロードしたjsonfile';
$graphNode = file_get_contents($wp_upload_dir['baseurl'].$jsonfile);

//facebook日本語マルチバイトデコード"\n00xx"-"%xx"に置換してURLDecode
$patterns = '/\Q\u\E00([0-9A-Fa-f]{2})/';
$graphNode = preg_replace_callback($patterns, 
        function ($matches) {
            return rawurldecode('%' . $matches[1]);
        }, $graphNode);

$json = json_decode($graphNode,true);
if(json_last_error() !== JSON_ERROR_NONE){
    // エラー処理
} else {
    if (array_key_exists('group_posts',$json)) {
        //グループ投稿jsonはgroup_posts,activity_log_dataを削って階層同じにする
        $json = $json['group_posts']['activity_log_data'];
    }
}

//jsonfileからの場合
$feed = $json; //そのまま

foreach ( $feed as $feeddata ) {
    //attachments
    //$feeddata['attachments'][0]['data']下の配列にあります。存在チェック要。
    //         ['attachments'][0]['data'][n]['media']['uri']にダウンロードしたファイル名で入っています。
    //メディア登録するコードを記述します。
    //$atthtml = '<img src="{$url}" >'; //メディア登録した画像や動画を投稿に埋め込むHTMLを作成しよう。

    //insertpost
    $post_content = $feeddata['data'][0]['post'] . $atthtml;
    $post_title = mb_strimwidth($post_content,0,20,"..."); //Facebookの投稿はタイトル無いので。

    $post = array(
        'post_content'   => $post_content, // 投稿の全文。
        'post_title'     => $post_title, // 投稿のタイトル。
        'post_status'    => 'publish', // 公開ステータス。デフォルトは 'draft'。
        'post_type'      => 'post', // 投稿タイプ。デフォルトは 'post'。
        'post_date'      => wp_date("Y-m-d H:i:s",$feeddata['timestamp']) // 投稿の作成日時。
    );

    // 投稿をデータベースへ追加
    $postid = wp_insert_post( $post );
}

今回もシンプルにさせていただきました。
処理時間が長くなるとエラーで中止されてしまうので、
制限時間を指定しておきます。
処理が終了するまで、ブラウザのクルクルが回っています。気長に待ちます。
attachmentsのところはごめんなさい。
必要であればご自身で記述してください。

依頼されているFacebookは、投稿データが何百件、何千件とあります。
添付の画像ファイルもすごく多いので、データを範囲指定して取り込みますが、数時間ごと、何回かに分けて実行します。