WordPress에서 마이크로CMS로 보도를 옮길 때의 비망록
31328 단어 WordPressmicroCMSHeadlessCMStech
워드프레스가 만든 사이트를 마이크로CMS로 옮길 기회가 있었기 때문에 당시 진행됐던 보도 이전 방법의 메모였다.
전제 조건
Microsoft 준비
마이크로CMS의 계정 등록과 서비스 제작은 완료를 전제로 작성됐다.
X-WRITE-AAPI-KEY 만들기
서비스 설정 화면의 API-KEY 프로젝트에서 X-WRITE-AAPI-KEY
新規作成
에서 인증 키를 만듭니다.이 인증 키는 나중에 사용됩니다.
컨텐츠의 HTTP 방법을 설정하여 POST 허용
HTTP 방법의 설정은 내용에 따라 할 수 있기 때문에 서비스를 통과하지 않고 내용의 API 설정에서 POST를 허용합니다.(기본값은 GET에만 유효)
API 모드 설정
전송할 데이터의 API 모드를 설정합니다.
이번에는 다음과 같은 모드를 제작했다.
(제목): 텍스트 필드
호환성 문제에 대한 대응
Word Press의 WysiWyg 편집기에서 쓴 데이터가 내보낼 때 HTML로 변하기 때문에 마이크로CMS의 풍부한 편집기에 직접 로그인하면 좋지 않습니다.
옮긴 기사는 편집할 일이 거의 없기 때문에 사전에
html_contents(HTMLエディタ)
라는 옮긴 기사용 필드를 준비해 준비한 복선상자is_html(HTMLエディタを使う)
의 검사contents
나html_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 및 컨텐트 수 제한 수정 사전 통지 정보
Reference
이 문제에 관하여(WordPress에서 마이크로CMS로 보도를 옮길 때의 비망록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kandai/articles/f6a034d166e4c977a78e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)