作成日:2020-12-01, 更新日:2020-12-01
基本:JSONで取得
・Wordpressを設置したURLに「/wp-json/wp/v2/posts?_embed」をつける
ブラウザで確認
▼ドメイン直下にWordpressを設置した場合
・http://example.com/wp-json/wp/v2/posts?_embed
▼ドメイン直下の「ディレクトリ:blog」の下にWordpressを設置した場合
・http://example.com/blog/wp-json/wp/v2/posts?_embed
404になるとき
パーマリンクの設定を「基本」から「日付と投稿名」など別のものに変更する。
ajaxでゴニョゴニョする
var url_wp = '/〇〇';
$.ajax({
type: 'GET',
url: url_wp+'/wp-json/wp/v2/posts?_embed',
dataType: 'json'
}).done(function(json){
// 取得成功
alert( JSON.stringify(json) );
}).fail(function(json){
// 取得失敗
alert('ブログ記事取得失敗')
});
REST API機能の有効・無効化
▼管理画面が使えなくなる(固定ページを追加しようとしたら真っ白になった)・・・
あまり複雑なコトはしたくない・・・ひとまず緩めに設定する
→途中まで準備はした。でも運用方針でREST API自体を使わなくなったのでひとまず保留
やりたいこと
・他人のアクセスは拒否したい
・戻す値を決めたい
・特定のプラグインは許可する
他人のアクセスは拒否したい
ひとまずリファラから同一HOSTか確認
※ワンタイムトークン(?)とか使ったほうが良いと思う
戻す値を決めたい
通常だとマルっと値を返すので使いたいものだけ返す
※JS側の処理を軽くしたい
▼エンドポイントを自作する必要があるそうだ。
仮に「https://{ドメイン}/wp-json/custom/v0/test」とする。
特定のプラグインは許可する
REST APIを使うプラグインもあるそうだ。
サンプル
▼ファイル構成
・同一階層に新規作成するファイル「_restapi_endpoint.php」
・使っているテンプレートの「functions.php」
・表示するページ:ajax
同一階層に新規作成するファイル「_restapi_endpoint.php」
本来なら記事を取得する処理を記載。ひとまず確認用に値を直接返すだけにしておく。
<?php return array( 'id' => 1, 'test' => true, 'message' => 'テスト' );
使っているテンプレートの「functions.php」に追記する
function restapi_endpoint_response($file_name, $param = null) {
$api_file = locate_template($file_name);
$res = !empty($api_file) ? include_once $api_file : [];
$response = new WP_REST_Response($res);
$response->set_status(200);
return $response;
}
function restapi_endpoint_callback($param) {
$filename_getpost = '_restapi_endpoint.php'; // 記事を取得するためのファイル名
return restapi_endpoint_response($filename_getpost, $param);
}
function restapi_endpoint(){
// APIのURL: https://{ドメイン}/wp-json/custom/v0/test
register_rest_route(
'custom/v0',//ネームスペース
'/test', //ベースURL
[ //オプション
'methods' => WP_REST_Server::READABLE,
'permission_callback' => '__return_true',
'callback' => 'restapi_endpoint_callback'
]
);
}
add_action('rest_api_init', 'restapi_endpoint');
// REST API機能の有効・無効化
function deny_restapi_except_plugins( $result, $wp_rest_server, $request ){
$accept = true;
// 同一HOSTからの呼び出しのみ許可
if ( $accept && array_key_exists('HTTP_REFERER', $_SERVER) ) {
$referer_host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if( $referer_host != $_SERVER['HTTP_HOST'] ){
$accept = false;
}
}
else {
$accept = false;
}
// 任意のプラグインのみ許可
if ( $accept ) {
$namespaces = $request->get_route();
$seed_accept_plugins = array(
'contact-form-7/',// Contact Form7
'oembed/', // oembed
'jetpack/', // Jetpack
'custom/', // 自作したエンドポイント
);
$tmp_accept = false;
foreach ( $seed_accept_plugins as $row_accept_plugin ) {
if( strpos( $namespaces, $row_accept_plugin ) === 1 ){
$tmp_accept = true;
break;
}
}
$accept = $tmp_accept;
}
if ( $accept ) {
return $result;
}
else {
return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins', 10, 3 );
表示するページ:ajax
<script>
$(function(){
var myHost = 'http://example.com';
var ep = '/custom/v0/test';
$.ajax({
type: 'GET',
url: myHost + '/wp-json' + ep,
dataType: 'json'
}).done(function(json){
alert( JSON.stringify( json ) );
}).fail(function(json){
alert('失敗')
});
});
</script>
関連項目
・Wordpressの関数をWordpress外から呼び出す(wp-load.phpの読込み)
・wordpressの記事を直接DBから取得