WordPress REST APIで記事を取得する方法|基本エンドポイント解説
WordPress REST APIで記事を取得したいなら、まず使うのは wp/v2/posts です。公開済みの記事一覧は GET /wp-json/wp/v2/posts、特定の記事1件は GET /wp-json/wp/v2/posts/{id} で取得できます。
WordPressを外部サイトに一覧表示したいとき、社内ツールで新着記事を拾いたいとき、Node.jsやJavaScriptから記事データを再利用したいときに、この基本形を知っていると作業がかなり早くなります。
- できること: WordPressの記事一覧取得、1件取得、絞り込み、ページ分割取得
- よく使う場面: 新着記事の表示、別システム連携、ヘッドレスCMS的な利用
- 先に覚えるURL:
https://example.com/wp-json/wp/v2/posts - 最初の結論: 一覧は
posts、個別はposts/{id}、軽量化は_fieldsを使うのが基本です
ここがポイント: 公開済み投稿の取得は、まず認証なしで試せるケースが多いです。最初は
curlかブラウザで JSON を確認するとつまずきにくくなります。
まず押さえたい前提
WordPress REST APIは、WordPressのデータをJSONでやり取りするための仕組みです。公式ドキュメントでは、APIの入口として .../wp-json/ が案内されています。
今回の主な対象は次の環境です。
- 対象: WordPressサイトの投稿データ
- 主なエンドポイント:
wp/v2/posts - 取得形式: JSON
- 確認時点: 2026年4月22日
- 参照した公式資料: WordPress Developer Resources の REST API Handbook
まずはブラウザで次のURLを開いて、JSONが返るか確認してください。
https://example.com/wp-json/
ここでJSONが見えれば、REST APIの入口には到達できています。
基本エンドポイントはこの2つ
最初に使うべきURLは多くありません。記事取得だけなら、まず次の2本で十分です。
記事一覧を取得する
公開済み投稿の一覧は、次のエンドポイントで取得します。
GET https://example.com/wp-json/wp/v2/posts
curl で試すとこうなります。
curl https://example.com/wp-json/wp/v2/posts
返ってくるのは配列です。各要素に id、date、slug、link、title、excerpt などが入ります。
記事を1件だけ取得する
IDが分かっている記事を1件だけ取りたいときは、末尾にIDを付けます。
GET https://example.com/wp-json/wp/v2/posts/123
curl https://example.com/wp-json/wp/v2/posts/123
こちらは配列ではなく、1件分のJSONオブジェクトが返ります。記事詳細ページを外部システムで表示したいときに使いやすい形です。
一覧取得でよく使うクエリパラメータ
posts エンドポイントは、そのままでも使えます。ただ、実務では絞り込みがほぼ必須です。
件数を調整する
初期状態では、一覧取得の per_page のデフォルトは 10 です。
GET /wp-json/wp/v2/posts?per_page=5
curl "https://example.com/wp-json/wp/v2/posts?per_page=5"
公式資料では per_page は 1 から 100 までです。大量取得したいときでも、1回で全部は返せません。
ページ送りする
2ページ目、3ページ目と順に取りたいなら page を使います。
GET /wp-json/wp/v2/posts?page=2&per_page=10
実務では「最新10件だけ」ではなく、「全件を順番に回収したい」場面があります。そのときは page を増やしながら取得します。
検索文字列で絞る
タイトルや本文に関連する投稿を探したいときは search が便利です。
GET /wp-json/wp/v2/posts?search=API
社内の簡易検索や、特定キーワードを含む投稿一覧を作るときに使いやすい条件です。
スラッグで絞る
URL用のスラッグが分かっているなら、slug で対象を絞れます。
GET /wp-json/wp/v2/posts?slug=hello-world
「IDは知らないが、スラッグは分かる」というケースではこの取り方が実務的です。返り値は1件でも配列なので、その前提で処理します。
並び順を変える
日付順以外で並べたいなら order と orderby を使います。
GET /wp-json/wp/v2/posts?orderby=modified&order=desc
更新日が新しい記事順に取りたいときに役立ちます。
必要な項目だけ返して軽くする
一覧APIをそのまま使うと、本文やリンク情報まで含んだ大きめのJSONが返ります。新着一覧やカード表示なら、全部は不要です。
そんなときはグローバルパラメータ _fields を使います。
GET /wp-json/wp/v2/posts?_fields=id,date,slug,link,title,excerpt
curl "https://example.com/wp-json/wp/v2/posts?_fields=id,date,slug,link,title,excerpt"
外部表示用の一覧では _fields を先に入れる くらいの感覚でちょうどいいです。レスポンスが小さくなり、通信量もパース負荷も抑えやすくなります。
JavaScriptで記事を取得する最小例
ブラウザやNode.js系の処理で触るなら、まずは fetch の最小例が分かれば十分です。
一覧を取得する例
const endpoint = 'https://example.com/wp-json/wp/v2/posts?per_page=3&_fields=id,slug,link,title,date';
async function fetchPosts() {
const response = await fetch(endpoint);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const posts = await response.json();
console.log(posts);
}
fetchPosts().catch(console.error);
期待される出力イメージ
[
{
"id": 123,
"date": "2026-04-20T10:00:00",
"slug": "sample-post",
"link": "https://example.com/sample-post/",
"title": {
"rendered": "サンプル記事"
}
}
]
ここで初心者が引っかかりやすいのは、title が文字列ではなくオブジェクトで返る点です。実際に表示するなら title.rendered を使います。
特定記事を取得する例
const postId = 123;
const endpoint = `https://example.com/wp-json/wp/v2/posts/${postId}`;
async function fetchPost() {
const response = await fetch(endpoint);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const post = await response.json();
console.log(post.title.rendered);
console.log(post.content.rendered);
}
fetchPost().catch(console.error);
記事詳細ページを別フロントで描画するなら、この形が基本になります。
curlで確認するときの実務的な見方
コードを書く前に curl でAPIの返り値を確認しておくと、無駄なデバッグが減ります。
よく見るポイントは次のとおりです。
- HTTPステータスが
200になっているか - 想定どおり JSON が返っているか
title.renderedやexcerpt.renderedのような入れ子構造を理解できているか- ページング時のヘッダー
X-WP-TotalとX-WP-TotalPagesが読めるか
ヘッダーも含めて見たいなら、たとえば次のように確認します。
curl -I "https://example.com/wp-json/wp/v2/posts?per_page=10"
記事数が多いサイトでは、このヘッダーを見ないと「どこまで取得すれば終わりか」が分かりません。
実務でよくある使いどころ
WordPress REST APIの投稿取得は、単なる技術メモではなく、日常的な連携処理にそのまま使えます。
外部サイトに新着記事を出す
採用サイト、企業サイト、製品サイトなどで、ブログ本体とは別の場所に新着一覧だけ出したいときがあります。
その場合は次の組み合わせが定番です。
per_page=3かper_page=5_fields=id,link,title,date,excerpt- フロント側で
title.renderedを整形して表示
これなら本文全体を取らずに済むので、一覧表示が軽くなります。
更新記事だけ拾う
更新ベースでデータを同期したいなら、modified_after や orderby=modified が役立ちます。
- 定期バッチで「前回以降に更新された記事だけ」取得する
- 外部DBに差分反映する
- 更新通知や監視に使う
新着だけでなく更新も追いたい業務では、公開日より更新日を見るほうが実用的です。
スラッグベースで記事を引く
フロント側のルーティングでスラッグを使う構成なら、?slug=xxx の取得が扱いやすくなります。
ID直指定よりURL設計に寄せやすく、ヘッドレスCMSっぽい使い方をしたいときに相性がいい方法です。
よくある失敗と対処
WordPress REST APIはシンプルですが、最初の数回は同じところで詰まりやすいです。
JSONが返らない
まず確認したい点は次のとおりです。
- URLが
.../wp-json/wp/v2/postsになっているか - サイトURL末尾のスラッシュやリダイレクトで崩れていないか
- セキュリティ系プラグインやサーバー設定でAPIアクセスが制限されていないか
トップの wp-json が開けないなら、投稿エンドポイント以前の問題です。入口から切り分けるほうが早いです。
1件返ると思ったのに配列だった
/posts/123 はオブジェクトですが、/posts?slug=hello-world は配列です。同じ「1件だけ欲しい」でも返り値の形が違います。
この違いを見落とすと、JavaScriptで post.title.rendered と書いた瞬間にエラーになります。
必要以上に重いレスポンスを取っている
一覧表示なのに本文 content まで毎回取っていると、通信量が増えます。
対処は単純です。
- 一覧では
_fieldsを使う - 詳細画面だけ本文を取る
per_pageを必要以上に大きくしない
非公開投稿まで取れると思っていた
公式リファレンスでは、投稿一覧の status パラメータも用意されています。ただし、非公開や下書きなどを扱う場合は権限や認証の前提が変わります。
公開済み記事の取得だけを目的にするなら、まずは publish 前提で設計したほうが安全です。
投稿と固定ページは別エンドポイント
ここは実務で地味に大事です。WordPressでは投稿と固定ページでエンドポイントが分かれています。
- 投稿:
/wp-json/wp/v2/posts - 固定ページ:
/wp-json/wp/v2/pages
お知らせ一覧やブログ記事は posts、会社概要やお問い合わせのような固定ページは pages です。欲しいデータ種別を間違えると、JSONは返っても中身が合いません。
代替手段と使い分け
WordPressの記事取得はREST API一択ではありません。とはいえ、次のように整理すると選びやすくなります。
REST APIが向くケース
- 外部アプリやフロントエンドから扱いたい
- JSONで受け取りたい
- 投稿一覧や個別記事をHTTPで取得したい
管理画面やテーマ内処理が向くケース
- WordPressテーマ内部だけで完結する
- PHPのテンプレートタグやクエリで十分
- 外部連携より表示調整が主目的
外部から使うならREST API、WordPress内部だけで閉じるなら通常のテーマ実装、という切り分けが分かりやすいです。
最初に試す手順
ここまで読んだら、次の順で試すと詰まりにくくなります。
https://example.com/wp-json/をブラウザで開くhttps://example.com/wp-json/wp/v2/postsで投稿一覧を確認する?per_page=3を付けて件数を変える?_fields=id,slug,link,title,dateを付けて軽量化する/{id}で1件取得を試す- JavaScriptの
fetchに置き換える
この順なら、URLミスとJSON構造の誤解を早い段階で潰せます。
まとめ
WordPress REST APIで記事を取得するときの基本は、かなり明快です。
- 一覧取得は
GET /wp-json/wp/v2/posts - 1件取得は
GET /wp-json/wp/v2/posts/{id} - 絞り込みは
per_page、page、search、slug、orderby - 軽量化は
_fields - 件数の把握は
X-WP-TotalとX-WP-TotalPages
最初から複雑な連携を組むより、まず curl で返り値を確認し、次に fetch へ移すほうが確実です。次に見るべきポイントは、自分の用途が「一覧表示」なのか「詳細取得」なのか、そして本文まで必要かどうかです。そこが決まると、使うパラメータもかなり絞れます。
