# WordPress REST API 페이지네이션 사양 ## 조사 결과 ### 문제 발견! WordPress API의 **기본 `per_page` 값이 10 이하**로 설정되어 있어서 Post 22가 보이지 않았습니다. ## 실제 데이터 확인 ### 기본 쿼리 (per_page 미지정) ```bash GET /wp-json/wp/v2/posts?_embed ``` **반환:** 3개 포스트만 (Post 83, 75, 68) ### per_page=100 쿼리 ```bash GET /wp-json/wp/v2/posts?per_page=100 ``` **반환:** 13개 포스트 (Post 22 포함!) ```json [ 83, 75, 68, 63, 59, 56, 52, 33, 30, 26, 22, // ← Post 22가 여기 있습니다! 20, 1 ] ``` ## WordPress REST API 페이지네이션 파라미터 ### 1. per_page (페이지당 아이템 수) ```bash # 기본값: 10 (WordPress 설정에 따라 다름) # 최대값: 100 GET /wp-json/wp/v2/posts?per_page=50 ``` ### 2. page (페이지 번호) ```bash # 1부터 시작 GET /wp-json/wp/v2/posts?per_page=10&page=1 # 첫 페이지 GET /wp-json/wp/v2/posts?per_page=10&page=2 # 두 번째 페이지 ``` ### 3. offset (건너뛸 아이템 수) ```bash GET /wp-json/wp/v2/posts?per_page=10&offset=5 ``` ### 4. 응답 헤더 WordPress API는 응답 헤더에 페이지네이션 정보를 포함합니다: ``` X-WP-Total: 13 # 전체 포스트 수 X-WP-TotalPages: 2 # 전체 페이지 수 Link: <...>; rel="next" # 다음 페이지 URL ``` ## 현재 Next.js 코드의 문제 ### 문제 코드 (`/lib/api.ts:232`) ```typescript const res = await fetch(`${apiBase}/posts?_embed`); ``` **문제:** `per_page` 파라미터를 지정하지 않아서 기본값(약 10개)만 가져옴 ### 해결 방법 #### 옵션 1: per_page=100 추가 (간단함) ```typescript const res = await fetch(`${apiBase}/posts?_embed&per_page=100`); ``` - 장점: 코드 수정 최소화 - 단점: 최대 100개까지만 가능 #### 옵션 2: 페이지네이션 구현 (완전한 해결) ```typescript async function fetchAllPosts(): Promise { const apiBase = getWPApiBase(); if (!apiBase) return []; let allPosts: any[] = []; let page = 1; let hasMore = true; while (hasMore) { try { const res = await fetch( `${apiBase}/posts?_embed&per_page=100&page=${page}` ); if (!res.ok) break; const data = await res.json(); const posts = toArray(data); if (posts.length === 0) { hasMore = false; } else { allPosts = [...allPosts, ...posts]; // 헤더에서 총 페이지 수 확인 const totalPages = res.headers.get('X-WP-TotalPages'); if (totalPages && page >= parseInt(totalPages)) { hasMore = false; } page++; } } catch (error) { console.error(`Error fetching page ${page}:`, error); break; } } return allPosts.map((item: any) => { // 기존 매핑 로직 }).filter((post) => post.subCategory); } ``` #### 옵션 3: orderby와 per_page 조합 ```typescript const res = await fetch( `${apiBase}/posts?_embed&per_page=100&orderby=date&order=desc` ); ``` ## 권장 수정사항 ### 즉시 적용 (Quick Fix) `/lib/api.ts:232` 수정: ```typescript // 변경 전 const res = await fetch(`${apiBase}/posts?_embed`); // 변경 후 const res = await fetch(`${apiBase}/posts?_embed&per_page=100`); ``` ### 추가 테스트 수정 후 다음 명령어로 테스트: ```bash # Next.js 앱 재시작 cd /var/www/tkim.planitai.co.jp/blog/PlanitAI_Inc_website/nextjs npm run build # Revalidate 호출 curl "https://www.planitai.co.jp/api/revalidate?secret=LWCTd22HKmCa8uNqOvaoTYlXoNONFVlhx" # 웹사이트 확인 # https://www.planitai.co.jp/blogs ``` ## WordPress API 전체 사양 참고 공식 문서: https://developer.wordpress.org/rest-api/reference/posts/ 주요 파라미터: - `context`: view, embed, edit - `page`: 페이지 번호 - `per_page`: 페이지당 아이템 수 (최대 100) - `search`: 검색어 - `after`: 특정 날짜 이후 포스트 - `before`: 특정 날짜 이전 포스트 - `author`: 작성자 ID - `categories`: 카테고리 ID - `tags`: 태그 ID - `orderby`: date, relevance, id, title 등 - `order`: asc, desc ## 참고: 현재 WordPress에 있는 모든 포스트 총 13개: 1. Post 83 (2025-11-27) 2. Post 75 (2025-11-27) 3. Post 68 (2025-11-26) 4. Post 63 5. Post 59 6. Post 56 7. Post 52 8. Post 33 9. Post 30 10. Post 26 11. **Post 22 (2025-11-18) ← 찾던 포스트!** 12. Post 20 13. Post 1