フォームの送信や REST API の呼び出しが、本当にそのサイトの画面から来たものかを確かめるための合言葉(nonce)を作ります。確かめる側では、同じ名前を付けて wp_verify_nonce() などで照らし合わせます。
書き方
wp_create_nonce( string|int $action = -1 ): string
$action:何のための合言葉かを表す名前です。確かめるときも同じ名前を使います。REST API で使うときは'wp_rest'にします。- 戻り値:10 文字の英数字です。ログインしている人ごとに違い、12〜24 時間で切り替わります。
使い方の例
管理画面の JavaScript から REST API を呼ぶときは、作った合言葉を X-WP-Nonce のヘッダーに入れて送ります。
add_action( 'admin_enqueue_scripts', function () {
wp_enqueue_script( 'my-admin', get_stylesheet_directory_uri() . '/js/my-admin.js', array(), '1.0.0', true );
wp_localize_script( 'my-admin', 'myAdmin', array(
'root' => esc_url_raw( rest_url() ),
'nonce' => wp_create_nonce( 'wp_rest' ),
) );
} );
// my-admin.js
fetch( myAdmin.root + 'wp/v2/posts?per_page=5', {
headers: { 'X-WP-Nonce': myAdmin.nonce }
} ).then( r => r.json() ).then( posts => console.log( posts ) );
フォームなら、名前を決めて作り、受け取る側で確かめます。
// フォームの中
wp_nonce_field( 'my_save_action', 'my_nonce' );
// 受け取る側
if ( ! isset( $_POST['my_nonce'] ) || ! wp_verify_nonce( $_POST['my_nonce'], 'my_save_action' ) ) {
wp_die( '送信を確かめられませんでした。' );
}
よくある間違い
- 作るときと確かめるときで名前(
$action)が違う。REST API で'wp_rest'以外の名前にすると、ログインしていても 403 になります。 - ページのキャッシュが効いているページに埋め込む。合言葉は時間で切り替わるので、キャッシュに残った古い合言葉では通らなくなります。キャッシュしないページで出すか、Ajax で取り直します。
- ログインしていない人を守るつもりで使う。合言葉はログインしている人ごとに作られるもので、ログインしていない人には同じものが出ます。権限の確かめ(
current_user_can())の代わりにはなりません。
管理画面のページで wpApiSettings が用意されていないときは、/wp-admin/admin-ajax.php?action=rest-nonce を開くと、ログインしている人の REST API 用の合言葉が返ってきます。
関連する関数
wp_verify_nonce():合言葉を確かめるwp_nonce_field():フォームに合言葉の隠し欄を出すcheck_admin_referer()・check_ajax_referer():管理画面の送信・Ajax で確かめる



