WordPressを使用する案件で、以下のような要件を実現する必要がありました。
-
- APIでログインしている会員に紐づく記事IDを取得して、それを表示させる
- 記事IDはWordPressのDBテーブルとは別のCMSで管理しているDBに保持する
- 別のCMSで保持している会員IDと記事IDを紐付けする
別のCMS側でDBテーブルを作成して、それを取得するAPIは実装したのですが、WordPressの記事をAPIで取得する際にちまたでよく言われている「WordPress REST API」を使用することで、記事の取得はできます。
がしかし、標準の「WordPress REST API」だと、例えば記事IDを指定して記事を取得する場合
https://{{WordPressサイトのURL}}/wp-json/wp/v2/posts/{{記事ID}}
このような指定になります。ただこれだと記事1件しか取れません、複数取りたいのに・・・。
どうしたものかと頭を悩ませ調べていたところ見つけました。「WordPressの独自(カスタム)エンドポイント」です。
作成方法としては、
①functions.phpに独自(カスタム)エンドポイントを記述
例えばこのような感じです。
add_action('rest_api_init', function() {
//REST APIのURLを作る
register_rest_route( 'wp/v2', '/custom_rest_api/(?P<id>[a-zA-Z0-9-]+)', array(
'methods' => 'GET',
'callback' => 'custom_rest_api',
'permission_callback' => function() { return true; }
));
});
id○○○id○○○・・・のように、記事IDを繋げてパラメタに設定するようにしました。
②取得するための処理を実装する
function custom_rest_api( $data ) {
//REST API の中身
$idStr = $data['id'];
$idArr = [];
$idArr = explode('id', $idStr);
//空の要素を削除してインデックスを振りなおす
$idArr = array_values( array_filter($idArr) );
$contents = array();
$myQuery = new WP_Query();
$param = array(
'post_type' => array( 'post', 'カスタム投稿タイプのslug1', 'カスタム投稿タイプのslug2', 'カスタム投稿タイプのslug3', 'カスタム投稿タイプのslug4' ),
'posts_per_page' => -1,
'post__in' => $idArr,
'order' => 'date',
'orderby' => 'DESC',
);
$myQuery->query($param);
if($myQuery->have_posts()):
while ( $myQuery->have_posts() ) : $myQuery->the_post();
・
・
・
処理前半は繋げてパラメタとして渡した記事IDを分割して配列に設定し、以降はWordPressのテンプレートで使用されるWP_Queryを使用して記事の取得を行います。
テンプレートでの記事取得の実装を行なっている身としては馴染みがあるのでとても理解しやすいです。通常の記事に加えてカスタム投稿タイプも取得できてしまいます。
③実装したら、エンドポイントへアクセスしてみる
今回の場合だと
https://{{WordPressサイトのURL}}/wp-json/wp/v2/custom_rest_api/id{{記事ID}}id{{記事ID}}
にブラウザでアクセスしてみると・・・
(データは見せられませんのですみません・・・)JSON形式で取得ができました!!