wp_create_nonce():フォームや REST API の合言葉(nonce)を作る(WordPress)

フォームの送信や 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 で確かめる

逆引きリファレンスの一覧へ

サイドバー

よく使うカスタマイズ

最近の記事

  1. Fstyle Final Output Replacer のルールの一覧(generator タグを消す 2 つのルール)

Profile

PAGE TOP