WP4.7から前までのWP-APIを上書き?するような感じでfilterによるカテゴリースラッグからの記事の絞り込みができなくなってしまいました。
WPのカテゴリー記事一覧をWP REST APIで叩く場合、
スラッグからIDを把握する→IDから記事一覧を叩く
と2段階の工程が必要になります。
(npmでのWP REST APIライブラリでもpromiseを用いて上記のような手順でした)
これを1段階にしたい場合、
- カテゴリーページにIDを挿入しておく(pjaxなどで破棄されたらどうする)
- つくる
自分の場合、URLからどのカテゴリーなのかを把握するような構成にしていたので非常に悩みました。
というわけで作りました。
functions.php
function get_posts_from_cat( $request ) {
$cat = get_category_by_slug($request['slug']);
if (!$cat) {
return null;
}
$request['categories'] = $cat;
$response = new WP_REST_Posts_Controller('post');
$posts = $response->get_items($request);
if ( empty( $posts ) ) {
return null;
}
return $posts;
}
add_action( 'rest_api_init', function () {
register_rest_route( 'slug/v1', '/cat/(?P<slug>.*)', array(
'methods' => 'GET',
'callback' => 'get_posts_from_cat'
) );
} );
function get_posts_from_tag( $request ) {
$tags = get_tags(array('slug' => $request['slug']));
if (!$tags) {
return null;
}
$request['tags'] = $tags[0]->term_id;
$response = new WP_REST_Posts_Controller('post');
$posts = $response->get_items($request);
if ( empty( $posts ) ) {
return null;
}
return $posts;
}
add_action( 'rest_api_init', function () {
register_rest_route( 'slug/v1', '/tag/(?P<slug>.*)', array(
'methods' => 'GET',
'callback' => 'get_posts_from_tag'
) );
} );
ひとつに纏められないかなと思うのですが、このまま公開します。(カスタムタクソノミーもその気になればいけるはずです)
URL/slug/v1/cat/スラッグ
URL/slug/v1/tag/スラッグ
でスラッグ(URLエンコード可)で記事一覧が取得できます。もちろん_embedやper_pageなどの他のパラメーターも併用可能です。
コアを見る
これあんまり情報がないため、コアのコードをみたらget_items()で色々できるような感じだったので色々やったらできました。
$response = new WP_REST_Posts_Controller('post');
$posts = $response->get_items($request);
該当部分
wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
https://github.com/WordPress/WordPress/blob/master/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
おわりに
new WP_REST_Posts_Controllerして、get_items()したらなんでもできる!(ようなきがする)