per_page パラメータで設定できる数値は1から100までなので、最大100件しか一度に記事を取得することができません。そして残念ながら REST API には全件取得するという機能が無いようです。
そのため、Next.js 側で再帰関数を実行して全件取得します。この辺が Jamstack の面倒なところですね…!microCMS なんかはきっと用意されているんでしょうけど。
const listAllPosts = async (
APIURLBuilder: WPAPIURLBuilder,
posts: WPPost[] = []
): Promise<WPPost[]> => {
const perPage = 20;
try {
// 今回の処理でフェッチした記事一覧
const url = APIURLBuilder.perPage(perPage).getURL();
const response = await fetch(url);
// エラーレスポンスの場合はレスポンスをスローして中断
if (
response instanceof Error ||
(response.data && response.data.status && response.data.status > 399)
) {
throw response;
}
// 前回分までとマージする
const mergedPosts = [...posts, ...response];
// 記事数が perPage 数より少なかったら処理終了
if (response.length < perPage) {
return mergedPosts;
}
// ↑で処理が終了しなかったら次のページが存在するということなので次のページへ進む
APIURLBuilder.nextPage();
// 再帰の実行
return listAllPosts(APIURLBuilder, mergedPosts);
} catch (error) {
throw error;
}
};
20件づつ記事を取得して、たとえば15件しか記事がフェッチできなかった場合は次のページが無いので、そこで結果を返します。20件フルにあったならば、APIURLBuilder.nextPage() で API のページを1つ進めます。APIURLBuilder は 「WordPress Rest API の URL を作る JS クラス」をチェックしてください。
タグ一覧の取得も同じ処理で取得できます。
const listAllTags = async (
APIURLBuilder: WPAPIURLBuilder,
tags: WPTag[] = []
): Promise<WPTag[]> => {
const perPage = 20;
try {
const url = APIURLBuilder.perPage(20).getURL();
const response = await fetch(url);
// エラーレスポンスの場合はレスポンスをスローして中断
if (
response instanceof Error ||
(response.data && response.data.status && response.data.status > 399)
) {
throw response;
}
const mergedTags = [...tags, ...response];
if (response.length < perPage) {
return mergedTags;
}
APIURLBuilder.nextPage();
return listAllTags(APIURLBuilder, mergedTags);
} catch (error) {
throw error;
}
};
fetchメソッドですが、ネイティブの fetch ではなく、このようなポリフィル関数を利用しています。
import unfetch from "isomorphic-unfetch";
const fetch = async <JSON = any>(
input: RequestInfo,
init?: RequestInit
): Promise<JSON> => {
const res = await unfetch(input, init);
return res.json();
};
export default fetch;
isomorphic-unfetch はブラウザ環境でも Node.js環境 でも利用できるライブラリです。Axios も両方で使えたはずなので Axios を使ってもいいですね。
上記関数で記事やタグを全件取得することができたので、タグ一覧の表示や、getStaticPaths でのページ生成に利用することができます。