実現したいこと
Wordpressの記事データをmicroCMSへ移行するために、下記の記事を参考に移行しようとしています。
https://zenn.dev/kandai/articles/f6a034d166e4c977a78e
echo $data['id'] . ':' . $html . "\n";
しかし、参考記事の終盤に記載されている上記を実行すると
000(記事ID):{"message":"POST is forbidden."}
と、記事の数だけ返ってきてしまいました。
PHPはおろか、APIを叩くことにも慣れていませんので、どのようなエラーなのかいまいちイメージが出来ていないのですが、
こちらはPOSTを拒否されているということなのでしょうか...?
だとすると、デフォルト権限でPOSTを許可としているのに何故拒否されているのでしょうか?
やってみたこと
・microCMSのAPIスキーマなどの設定は参考記事の内容と全く同じように設定しました。
・しかし、取得したAPI KEYを記述する所の「X-WRITE-API-KEY」は、「X-MICROCMS-API-KEY」に変更しています(X-MICROCMS-API-KEYに統一されたようです)
・microCMS管理画面からデフォルト権限のGET、POSTにチェックがついているかどうかの再確認
・↑念の為、個別権限も同じように設定しました
・var_dumpで記事のデータが$dataの配列の通りに取得されているかどうかの確認(されていました)
・xmlのサイズを小さくして実行 参考
・一度に何度も実行してしまったので、時間を5時間ほど置いてから再度実行
microCMSのプランは無料プランです。
不足情報などございましたらご指摘いただけますと幸いです。
よろしくお願いします。
追記
実際のコードはこちらです。
php
1<?php 2 3// 読みこむXML 4$xml = "./blog.xml"; 5$imgBasePath = 'https://images.microcms-assets.io/bar/'; 6$xmlData = simplexml_load_file($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 7 8$url = 'エンドポイント'; 9$headers = array( 10 'Content-Type: application/json', 11 'X-MICROCMS-API-KEY: XXXXXXXXXX' 12); 13 14foreach ($xmlData->channel->item as $entry) { 15 16 // カテゴリの設定 17 $cateArray = []; 18 $categories = json_decode(json_encode($entry->category), true); 19 20 foreach ($categories as $category) { 21 if (is_array($category)) continue; 22 23 switch($category) { 24 case 'event': 25 $cateArray[] = 'event'; 26 break; 27 case 'notice': 28 $cateArray[] = 'notice'; 29 break; 30 case 'blog': 31 $cateArray[] = 'blog'; 32 break; 33 } 34 } 35 36 // コンテンツ取得 37 $contents = trim(strval($entry->children('content', true)->encoded)); 38 39 preg_match_all('/src="https:\/\/hoge\.com\/wp-content\/uploads\/(.*)(png|jpg|jpeg|gif)/i', $contents, $matches); 40 41 // 置き換え用の配列を作成 42 $pattern = []; 43 $replace = []; 44 foreach ($matches[0] as $key => $match) { 45 $pattern[] = '/' . preg_replace('/\//', '\/', $match) . '/'; 46 $pathArray = explode('/', $match); 47 $paths = array_reverse($pathArray); 48 $replace[] = 'src="' . $imgBasePath . "{$paths[2]}_{$paths[1]}_{$paths[0]}"; 49 } 50 51 // 置き換え実行 52 $html_content = preg_replace($pattern, $replace, $contents); 53 54 // 送信用のデータ作成 55 $data = [ 56 'id' => '000' . strval($entry->children('wp', true)->post_id), 57 'title' => trim(strval($entry->title)), 58 'category' => array_unique($cateArray), 59 'html_contents' => $html_content, 60 'is_html' => true, 61 'is_migration' => true 62 ]; 63 64 // curlでPOSTする 65 $ch = curl_init(); 66 curl_setopt($ch, CURLOPT_URL, $url); 67 curl_setopt($ch, CURLOPT_POST, TRUE); 68 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 69 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); 70 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 71 $html = curl_exec($ch); 72 73 // curlでエラー 74 if(curl_errno($ch)){ 75 $CURLERR .= 'curl_errno:' . curl_errno($ch) . "\n"; 76 $CURLERR .= 'curl_error:' . curl_error($ch) . "\n"; 77 $CURLERR .= '▼curl_getinfo' . "\n"; 78 foreach(curl_getinfo($ch) as $key => $val){ 79 $CURLERR .= '■' . $key . ':' . $val . "\n"; 80 } 81 echo nl2br($CURLERR); 82 } 83 84 curl_close($ch); 85 86 87 echo $data['id'] . ':' . $html . "\n";
■管理画面での設定
APIキー管理ページから設定できる「デフォルト権限」と「対象API」では、GET・POSTにチェックがついている状態です。
回答1件
あなたの回答
tips
プレビュー