AstroとWordpressでJamstack その1 準備編
公開日時:2024-03-05T08:05:40.180Z
WordpressサイトをSSG化したいというお仕事を頂いたので、詳細をメモしていきます。
今回は準備編。
SCFをRestAPIに出力する
もとサイトがSCF(Smart custom field)を使っていたので、SCFをrestapiに出力するように以下をfunctions.phpに記述
// rest apiにSCFカスタムフィールドを出力
add_action( 'rest_api_init', 'rest_scf_add_field' );
function rest_scf_add_field(){
register_rest_field(
'item', // 追加する投稿タイプ(カスタム投稿なら、その投稿タイプを指定する),
'scf', // 追加するフィールド名
[
'get_callback' => function(){
$metaArray = SCF::get('item_group'); // SCFで作ったGroup名(繰り返し対応)
$i = 0;
foreach($metaArray as $meta_field){
$imgUrl =wp_get_attachment_url($metaArray[$i]['img']);//SCFで作った繰り返し画像フィールド名からURLを取得
$imgThumUrl =wp_get_attachment_image_src($metaArray[$i]['img'],'thumbnail');//こちらはサムネールURLを取得
$metaArray[$i]['img'] = $imgThumUrl[0];//配列['img']に格納
$metaArray[$i]['imgThum'] = $imgThumUrl[0];//配列['imgThum']に格納
$i ++;
}
return $metaArray;
},
'update_callback' => null,
'schema' => null,
],
);
}
これでJSONにscfとして配列で出力されます。
AstroでのWPRestAPIの利用は基本形として
---
const res = await fetch('https://xxx.com/wp-json/wp/v2/posts?_embed'); //.envとかにサーバ情報は分離します。
const posts = await res.json();//ここ忘れがち。Jsonにコンバートしないとね。
---
<ul>
{
posts.map((post:any) => (
<li>{post.title.rendered}</li>
))
}
</ul>
が基本形。
Wordpressは100件以上のデータをデフォルトで出力しないのでこの対応も必要になってきます。
AstroPress