【WordPress】WP REST APIで「カスタム投稿タイプ」の記事一覧を取得する

▼毎日をちょっと楽しく過ごす

WordPressではREST APIを使って、WordPressを設置したサイトとは別のサイトに、Wordpressの記事などを表示できます。

このREST APIを使って、カスタム投稿タイプの記事一覧を、別のサイトで表示する方法を書きます。

今回は「カスタム投稿タイプ」を利用しますので、まず先に「カスタム投稿タイプ」でREST APIを使う設定をします。

カスタム投稿タイプでREST APIを利用できるようにする

カスタム投稿タイプはデフォルトでは、REST APIを許可しておらず、無効になっています。

それをまずは許可する設定を行います。

functions.phpでカスタム投稿タイプを作っている場合

functions.phpでカスタム投稿タイプを作っている場合は、オプション’’show_in_rest”をtrueにします。

//カスタム投稿タイプ「news」
function my_custom_post () {
    $args = array(
        'public'        => true,
        //色々設定(略します)
        .....
        
        //REST APIの設定
        'show_in_rest'  => true,
        'rest_base'     => 'news'

     );
    register_post_type('news', $args);
}
add_action( 'init', 'my_custom_post' );

show_in_rest :tureにすることで、WP REST APIで取得できる

rest_base : URLのベースになる名前、省略するとカスタム投稿タイプ名

プラグインCustom Post Type UIの場合

カスタム投稿タイプの新規作成、もしくは編集ページの「設定」の、

REST APIで表示(Show in REST API)を「True」

REST API ベーススラッグ(REST API base slug)に URLのベースになる名前を入れます。

↑このキャプチャは英語ですが、日本語化していれば「REST APIで表示」「REST API ベーススラッグ」という項目です。

さて、これでAPIを使う下準備ができました。

WP REST APIを使って、カスタム投稿タイプ一覧を取得する

下準備ができたところで、早速REST APIを使ってデータを取得してみたいと思います。

説明ではjQueryを使いますが、その時その時に合わせて都合が良い言語を使うと良いと思います。

$(function () {
  //WP REST API
  var url = 'https://example.com/wp-json/wp/v2/news';

  //GETで取得
  $.ajax({
    type: "GET",
    url: url,
    dataType: "json"
  })
  .done(function (data) {
     //処理
  })
  .fail(function (XMLHttpRequest, textStatus, errorThrown) {
    console.log(errorThrown);
  });
});

カスタム投稿タイプの記事一覧は以下のURLで取得できます。

https://example.com/wp-json/wp/v2/カスタム投稿タイプ名(もしくはベーススラッグ)

GETで取得できるので、ブラウザで叩いてみて確認するもの良いでしょう。

さて、一覧が取得できましたが、これだけではアイキャッチの情報が足りません。

WP REST APIでアイキャッチを取得する

返ってくる情報量を増やさないために、基本的なURLではアイキャッチなどの、リンク情報が含まれていません。

その為、パラメーターに_embedをつけることで、アイキャッチ情報も取得できるようになります。

https://example.com/wp-json/wp/v2/カスタム投稿タイプ名(もしくはベーススラッグ)?_embed

これで、外部のサイトで、カスタム投稿タイプ一覧で、アイキャッチを表示できるようになります。

基本的なものは揃いましたが、カスタムフィールドを使っている時もあるでしょう。

WP REST APIでカスタムフィールドの値を取得する

カスタムフィールドの値をAPIで取得するには、WordPress側のfunctions.phpを編集する必要があります。

//WP REST APIにカスタムフィールドを追加
function rest_api_add_fields() {

    register_rest_field('picture',
        'カスタムフィールド名',
        array(
            'get_callback'    => 'callback_register_fields',
            'update_callback' => null,
            'schema'          => null,
        )
    );
}
add_action( 'rest_api_init', 'rest_api_add_fields' );

//コールバック用
function callback_register_fields($post, $field_name) {
    return get_post_meta($post[ 'id' ], $field_name, true);
}

register_rest_fieldを使って、カスタムフィールドを追加しています。これでAPIにカスタムフィールドの値が入ってきます。

また、今回は動的なキーワードをAPIに投げて、カスタムフィールドを検索させる仕様でした。

WP REST APIを使って、カスタムフィールドを検索する

検索をするには、これも先にWordPressのfunctions.phpを編集します。

//WP REST APIでカスタムフィールドを検索
function rest_api_search($args, $request) {

    //エンドポイントで受け渡すパラメーターを変数に入れる
    $search_keyword = $request['パタメーター名'];
    
  //カスタムフィールドをLIKEで検索
    if ($search_keyword) {
        $args['meta_query'][] = [
            'key' => 'カスタムフィールド名',
            'value' => esc_sql($search_keyword),
            "compare" => "LIKE"
        ];
    }

    return $args;
}
add_filter('rest_カスタム投稿タイプ名_query', 'rest_api_search', 10, 2);

add_filter()を使って、REST API、カスタム投稿タイプのクエリの場合は、パラメーターで受け取ったキーワードを検索させる処理をしています。

まず、

rest_api_search関数の、$requestにパラメーターが入ってきます。

$argsはWP_Queryでも使うパラメーターです。その配列にmeta_queryを追加するイメージですね。

return で$argsを返します。

これで下準備はできました。

パラメーター名を「search」としてみましょう。その場合はこのようなURLで取得できます。

https://example.com/wp-json/wp/v2/カスタム投稿タイプ名?search=キーワード

パラメーターに動的な文字列を入れる場合は、URLエンコードをして入れておきましょう。

_embedをつけることもできます。

https://example.com/wp-json/wp/v2/カスタム投稿タイプ名?search=キーワード&_embed

searchパラメーターを、functions.phpの$request[‘search’]で受け取れます。

このように、WordPressから離れた別のWebサイトでもWordPressを操作ができます。とても便利ですね。

この記事はあなたの役に立ちましたか?