LoginSignup
15

More than 5 years have passed since last update.

WP REST APIをカスタマイズしてカテゴリースラッグやタグスラッグで記事を取得できるようにする

Last updated at Posted at 2017-01-21

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

参考箇所
https://github.com/WordPress/WordPress/blob/master/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php#L148

おわりに

new WP_REST_Posts_Controllerして、get_items()したらなんでもできる!(ようなきがする)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15