web-dev-qa-db-ja.com

ワードプレス REST API - パーミッションコールバック

私は現在、WP-REST v2プラグインを使って小さなREST AP​​Iを構築しています。すべてが完璧に動作していますが、ドキュメントにはパーミッションコールバックがあり、これは特定のユーザグループへのアクセスを制限します(まさに私がやろうとしていることです)。提供される構文は次のとおりです。

'permission_callback' => function () {
    return current_user_can( 'edit_others_posts' );
}

私が抱えている問題は、ログインして管理アカウントとして認証されているにもかかわらず、実行時に現在のユーザーが空になっているということです(セッショントークンはリクエストの前、最中、後に存在します)。私は、ルートエンドポイントがレスポンステキスト以外の何もないページを返すことが原因かもしれないと考えたので、私はindex.phpからAPIを呼び出そうとし、wp_get_current_user();が空のユーザーオブジェクトを返すのでcurrent_user_can('condition')は決して成功しません。

助けてくれてありがとう!

6
connorb

問題は、リクエストでnonce値を生成して送信していなかったためです。 nonce値を生成するために。 wp_create_nonce('wp_rest')関数呼び出しの値をローカライズします。

wp_localize_script('application', 'api', array(
    'root' => esc_url_raw(rest_url()),
    'nonce' => wp_create_nonce('wp_rest')
));

これはJavascriptを介してアクセスできるブラウザのwindowオブジェクトにアクセス可能になります。このnonceはXHR/HTTP Requestsを実行するときにリクエストヘッダX-WP-Nonceの値として渡されるべきです。その例は次のとおりです。

var request = new XMLHttpRequest();

request.addEventListener('load', function() {
    console.log(this.responseText);
}

request.open('GET', api.root + 'mynamespace/posts');

// You must set headers after the request has been opened and before itself.
request.setRequestHeader('X-WP-Nonce`, api.nonce);

request.send(); // will fire the event listener above when fulfilled.

これが役に立ったことを願っています。

9
connorb