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

Menu

twitter X