前回の続きです。
前回の問題点は、レスポンスのjson encodeがうまくいっていなかったようです。
今回やったのは、
https://--------/wp-jsonでjsonを返すのではなく、
カスタムエンドポイントを作って、そこで記事データをjson形式で返す。
と、いうのをやりました。
それでは、手順をざっくりと
#functions.phpにカスタムエンドポイントを登録
functions.php
function add_custom_endpoint()
{
//投稿データを返す
register_rest_route(
'api/v2',
'/posts',
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'get_posts_json'
)
);
}
add_action('rest_api_init', 'add_custom_endpoint');
/**
* WP REST APIのレスポンス処理
* @param {String} $file_name ファイル名(拡張子なし)
* @param {Array} $param ajaxで受け取ったデータ
*
* @return WP_REST_Response
*/
function rest_response($file_name, $param = null)
{
$api_file = locate_template("api/${file_name}.php");
$res = !empty($api_file) ? include_once $api_file : [];
$response = new WP_REST_Response($res);
$response->set_status(200);
$domain = (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"];
$response->header('Location', $domain);
return $response;
}
//投稿データを返す
function get_posts_json($param)
{
return rest_response('posts', $param);
}
#/api/posts.phpを作成
フォルダパスは上のfunctions.phpの$api_fileのところに合わせてください。
posts.php
<?php
header('Content-type: application/json; charset=utf-8');
$query = new WP_Query(
array(
'post_type' => 'post',
'post_status' => 'publish',
"posts_per_page" => 10
)
);
if ($query->have_posts()){
$postObj = [
array(
"title" => "",
"content" => ""
)
];
$i = 0;
while ($query->have_posts()){
$query->the_post();
$postObj[$i]['title'] = get_the_title();
$postObj[$i]['content'] = get_the_content();
$i++;
}
}
return json_encode($postObj);
やっぱりこれでもだめでした。
それで、json_encode()にオプションを追加したら...
posts.php
return json_encode($postObj, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);
成功!!
これで、json形式で記事データを返す流れはとりあえずできました。