WordPress에서 마이크로CMS로 보도를 옮길 때의 비망록

이 글은 Jamstack Advent Calendar 2020 21일째 글이다.늦은 시간에 죄송합니다.
워드프레스가 만든 사이트를 마이크로CMS로 옮길 기회가 있었기 때문에 당시 진행됐던 보도 이전 방법의 메모였다.

전제 조건

  • 옮길 글 데이터는WordPress의 기본 내보내기 기능으로 생성된 XML
  • 마이크로CMS용 POST API
  • CSV 가져오기 기능은 있지만 글이 0일 때만 사용하며 가져오기 성형의 번거로움을 고려하여 사용하지 않음
  • 샘플에 나타난 프로그램은 PHP로 썼다
  • Microsoft 준비


    마이크로CMS의 계정 등록과 서비스 제작은 완료를 전제로 작성됐다.

    X-WRITE-AAPI-KEY 만들기


    서비스 설정 화면의 API-KEY 프로젝트에서 X-WRITE-AAPI-KEY新規作成에서 인증 키를 만듭니다.
    이 인증 키는 나중에 사용됩니다.

    컨텐츠의 HTTP 방법을 설정하여 POST 허용


    HTTP 방법의 설정은 내용에 따라 할 수 있기 때문에 서비스를 통과하지 않고 내용의 API 설정에서 POST를 허용합니다.(기본값은 GET에만 유효)

    API 모드 설정


    전송할 데이터의 API 모드를 설정합니다.
    이번에는 다음과 같은 모드를 제작했다.
    (제목): 텍스트 필드
  • category(종류): 여러 내용 참조(기타 내용 참조)
  • contents(본문):부 편집기
  • is_}(HTML 편집기 사용): 진위 값
  • html_contents(HTML 편집기):텍스트 영역
  • is_migration (글 옮기기): 진위

  • 호환성 문제에 대한 대응


    Word Press의 WysiWyg 편집기에서 쓴 데이터가 내보낼 때 HTML로 변하기 때문에 마이크로CMS의 풍부한 편집기에 직접 로그인하면 좋지 않습니다.
    옮긴 기사는 편집할 일이 거의 없기 때문에 사전에 html_contents(HTMLエディタ)라는 옮긴 기사용 필드를 준비해 준비한 복선상자is_html(HTMLエディタを使う)의 검사contentshtml_contents 중 어느 것이 있는지 프런트에서 판단할 수 있다.
    또 옮긴 뒤 HTML 편집기를 사용하고 싶은 경우가 있을 수 있기 때문에 옮긴 기사와 새 기사를 통해 처리를 바꿔야 할 경우에 대비해 is_migration(移行記事)라는 확인란도 마련했다.(현재 사용 안 함)

    이미지 준비


    이미지 이름 바꾸기


    기본적으로 WordPress의 이미지는 폴더 구조/wp-content/uploads/{YYYY}/{MM}/{fileName}이지만 마이크로CMS의 미디어는 층 구조가 없기 때문에 이미지 경로의 교체가 순조롭게 진행되지 않고 이동할 수 없습니다.
    그래서 나는 파일 이름을 바꾸는 프로그램을 썼다{YYYY}_{MM}_fileName.
    (로컬에서 실행된 것으로 가정하고 실행된 곳wp-content/uploads/에 이미지가 있음)
    <?php
    // wp-content/uploads/ 以下の画像をすべて取得
    $images = glob("wp-content/uploads/*/*/*.*");
    
    foreach($images as $image) {
        // 画像パスを `/` で分解して逆順にする
        $pathArray = explode("/", $image);
        $paths = array_reverse($pathArray);
    
        // 画像を取得
        $data = file_get_contents($image);
    
        // ファイル名を `YYYY_MM_fileName` で `renamed_img` フォルダに保存
        file_put_contents("./renamed_img/{$paths[2]}_{$paths[1]}_{$paths[0]}", $data);
    }
    
    가 실행되면 renamed_img 폴더에 저장됩니다.renamed_img 폴더는 미리 만들어야 합니다.
    실행하면 이런 느낌이에요.

    이미지 업로드


    이름을 바꾼 이미지는 수동으로 업로드해야 하지만 마이크로CMS에서 화면을 관리하는 미디어를 드래그하여 여러 개를 업로드할 수 있습니다.
    실제 옮길 때는 2천장 정도의 이미지가 있었는데 중간에 멈추지 않고 10분 정도 기다리면 무난하게 이미지를 올릴 수 있었다.

    글 내용 이동 프로그램


    마이크로CMS의 POST API는 API 모드를 따라 보내고 싶은 내용을 JSON 형식으로 전송함으로써 데이터를 기사로 로그인할 수 있다.자세한 내용은 공식 문서를 참조하십시오.
    WordPress의 XML에서 JSON을 만들고 POST를 쓰는 프로그램입니다.

    설정 섹션


    환경에 따라 다른 부분이니 적당히 변경해 주세요.
    // 移行記事のxmlファイルを指定
    $xml = "./foo.xml";
    
    // microCMSの画像用CDNのURLとパス
    $imgBasePath = 'https://images.microcms-assets.io/bar/';
    
    //xmlを読み込み
    $xmlData = simplexml_load_file($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    
    $url = 'microCMSのAPIのエンドポイント';
    $headers = array(
        'Content-Type: application/json',
        'X-WRITE-API-KEY: 取得したAPI-KEY'
    );
    

    순환 문장 데이터


    각 보도 데이터에 필요한 처리를 추가하여 POST를 진행한다.
    foreach ($xmlData->channel->item as $entry) {
        // ここに処理を書いていく
    }
    
    다음은 순환 내용에 대한 처리입니다.

    범주 설정


    분류를 XML에 다음 형식으로 저장합니다.
    <item>
        <category domain="category" nicename="topics01"><![CDATA[お知らせ01]]></category>
        <category domain="category" nicename="topics02"><![CDATA[お知らせ02]]></category>
    </item>
    
    ["参照先id1","参照先id2"]와 같은 배열 형식으로 POST 처리를 한다.
    이때 $cateArray[]에 들어갈 때 마이크로CMS가 만든 클래스의 ID에 부합해야 한다.
    (nicename의 획득 방법을 몰라서 파워 스킬이 되었다)
    // カテゴリの設定
    $cateArray = [];
    $categories = json_decode(json_encode($entry->category), true);
    
    foreach ($categories as $category) {
        if (is_array($category)) continue;
    
        switch($category) {
            case 'お知らせ01':
                $cateArray[] = 'topics01';
                break;
            case 'お知らせ02':
                $cateArray[] = 'topics02';
                break;
            case 'お知らせ03':
                $cateArray[] = 'topics03';
                break;
        }
    }
    

    HTML 내의 이미지 경로 바꾸기


    이미지의 URL이 변경되므로 이미지를 업로드하는 URL 대신 마이크로CMS를 사용합니다.
    // コンテンツ取得
    $contents = trim(strval($entry->children('content', true)->encoded));
    
    // 画像を使っている部分を正規表現で抽出
    preg_match_all('/src="https:\/\/foober\.com\/wp-content\/uploads\/(.*)(png|jpg|jpeg|gif)/i', $contents, $matches);
    
    // 置き換え用の配列を作成
    $pattern = [];
    $replace = [];
    foreach ($matches[0] as $key => $match) {
        $pattern[] = '/' . preg_replace('/\//', '\/', $match) . '/';
        $pathArray = explode('/', $match);
        $paths = array_reverse($pathArray);
        $replace[] = 'src="' . $imgBasePath . "{$paths[2]}_{$paths[1]}_{$paths[0]}";
    }
    
    // 置き換え実行
    $html_content = preg_replace($pattern, $replace, $contents);
    

    데이터 POST


    전송용 데이터를 만들고curl로 POST를 진행합니다.
    // 送信用のデータ作成
    $data = [
        'id' => '000' . strval($entry->children('wp', true)->post_id),
        'title' => trim(strval($entry->title)),
        'category' => array_unique($cateArray),
        'html_contents' => $html_content,
        'is_html' => true,
        'is_migration' => true
    ];
    
    // curlでPOSTする
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $html = curl_exec($ch);
    
    // curlでエラー
    if(curl_errno($ch)){
        $CURLERR .= 'curl_errno:' . curl_errno($ch) . "\n";
        $CURLERR .= 'curl_error:' . curl_error($ch) . "\n";
        $CURLERR .= '▼curl_getinfo' . "\n";
        foreach(curl_getinfo($ch) as $key => $val){
            $CURLERR .= '■' . $key . ':' . $val . "\n";
        }
        echo nl2br($CURLERR);
    }
    
    curl_close($ch);
    
    // 結果の表示
    echo $data['id'] . ':' . $html . "\n";
    
    ID는 지정하지 않으면 자동으로 분배되지만 방향을 바꾸기 위해 WordPress가 포함된 글 ID의 ID를 지정했습니다.코드가 다 여기 있어요. .
    시행해 보다.
    $ php wp_to_microcms.php
    
    0009137:{"message":"duplicate id."}
    0009150:{"id":"0009150"}
    0009158:{"id":"0009158"}
    ...
    
    {"id":"XXXXXX"}와 같은 결과는 반환에 성공했다.
    테스트에 넣은 글 ID가 중복돼 오류가 발생했지만, 어떤 글이 어떤 이유로 오류를 일으켰는지 알 수 있다.
    마이크로CMS 관리 화면을 보니 기사가 제대로 등록돼 있었다.

    그게 다야.다른 사람의 참고가 될 수 있다면 나는 매우 기쁠 것이다!
    아, 마이크로CMS계획된 WRITE 요구 사항에 따라 다름 조심하세요.
    2021/9/1부터 요구수 제한이 없는 것 같아요!WRITE API 및 컨텐트 수 제한 수정 사전 통지 정보

    좋은 웹페이지 즐겨찾기