先日、WP_REST_Request Objectから記事のIDを取得しようにも上手く行かないことがありました。。
WP_REST_Requestともこの時が初めましてだったので、今回は自分が詰まった部分とその解決方法についてお話ししながらWP_REST_Requestについての理解も深めていこうと思います!
WP_REST_Requestとは?
公式では、以下のように説明されています。
「REST 要求オブジェクトを実装するために使用されるコア クラス。
コールバックに渡されるリクエストからのデータが含まれます。」
今回のコードだと以下のように書きましたので、「callback」の部分の処理によって返ってくるデータの事と理解しました!
function add_rest_endpoint_single_posts() {
register_rest_route(
'wp/api',
'/test/(?P<id>[\d]+)',
array(
'methods' => 'GET',
'callback' => '投稿取得のクエリを書いた関数名',
'permission_callback' => function() { return true; }
)
);
}
取得したいデータが「:protected」で取得できず。。
上記のコードに実際の前後記事の取得のため、以下の記事参考にさせて頂き、クエリ処理を追記しました。
WP REST APIで独自エンドポイントにパラメーターを使ってキーワード検索や個別記事を取得できるようにする
function get_single_posts($parameter) {
//一度全ての記事の取得
$args_all = array(
'posts_per_page' => -1,
'post_type' => 'カスタム投稿名',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
);
〜 省略 〜
}
//表示する事になる記事一件のみの取得
$args_single = array(
'posts_per_page' => 1,
'post_type' => 'カスタム投稿名',
'post_status' => 'publish',
'include' => $parameter[id]
);
〜 省略 〜
return $result;
}
add_action('rest_api_init', 'add_rest_endpoint_single_posts');
これで
https://exapmle.com/wp-json/wp/api/test/POST_ID
のようなURLにアクセスするとその前後の記事のIDが取れるはずだったのですが、、、上手くいきませんでした。。
取得できたデータは以下です。
WP_REST_Request Object (
[method:protected] => GET
[params:protected] => Array (
[URL] => Array (
[id] => 112
)
〜 省略 〜
paramsの中のURL > id を取りにいきたいのですが、[params:protected]で上手くデータにアクセスできていないようです。
protected から値を取り出すためのメソッドが存在する
同じような現象に遭遇している方達の記事を参考に、protectedから値を取り出すための方法を見つけました。
実は最初にご紹介したリファレンスページに書かれておりました。。。
公式リファレンス
「get_param — リクエストからパラメータを取得します。」
こちらを使ってコードを修正しました!
他にも :protected のデータを取得するメソッドが書かれておりました。
・get_headers — リクエストからすべてのヘッダーを取得します。
・get_method — リクエストの HTTP メソッドを取得します
などなど....
function get_single_posts($parameter) {
//追加
$param = $parameter->get_params();
//一度全ての記事の取得
$args_all = array(
'posts_per_page' => -1,
'post_type' => 'カスタム投稿名',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
);
〜 省略 〜
}
//表示する事になる記事一件のみの取得
$args_single = array(
'posts_per_page' => 1,
'post_type' => 'カスタム投稿名',
'post_status' => 'publish',
//修正
'include' => $param[id]
);
〜 省略 〜
return $result;
}
add_action('rest_api_init', 'add_rest_endpoint_single_posts');
https://exapmle.com/wp-json/wp/api/test/112でアクセスして、最終的に取得できたJSONデータ
※一部データの変更・削除を行い掲載しております。
[
{"ID":113,"thumbnail":false,"slug":"test-113","date":"2022-01-01 13:25:58","modified":"2022-01-01 13:26:07","title":"〜省略〜","excerpt":"","content":"〜省略〜","category":""},
{"ID":112,"thumbnail":false,"slug":"test-112","date":"2022-01-01 13:25:29","modified":"2022-01-01 13:25:29","title":"〜省略〜","excerpt":"","content":"〜省略〜","category":""},
{"ID":81,"thumbnail":"〜省略〜","slug":"test-81","date":"2021-10-30 17:49:49","modified":"2021-12-25 17:56:29","title":"〜省略〜","excerpt":"","content":"","category":""}
]
前後の記事の情報が取れました。
あとは、jsで情報の取得を行いリンク等繋いであげればOKでした!
まとめ
今回はWP_REST_Request Objectから記事のIDを取得する方法についてご紹介いたしました!
エンドポイントの作成や、クエリ処理を自由に記述できるようになると楽に情報の取得や表示ができると思うので今後も色々試しながら学んでいきたいと思います!