説明
wp_nonce_field() は、フォームにnonceの隠しフィールドを出力する関数です。
基本構文
wp_nonce_field( string|int $action = -1, string $name = '_wpnonce', bool $referer = true, bool $display = true ): string
引数
$action:処理を識別する文字列$name:フィールド名$referer:リファラーのフィールドも出力するか$display:出力するか(trueで出力。戻り値は常にHTML文字列)
戻り値
nonceの隠しフィールドのHTML文字列を返します。$display が true(既定)のときは、同じ文字列を出力もします。
使い方(サンプル)
wp_nonce_field( 'my_action', 'my_nonce' );
注意点
- フォーム内に出力し、受け取る側で
wp_verify_nonce()を使って検証します。
実務での使いどころ
- 管理画面の独自フォームや、メタボックスの保存処理で、CSRF対策を行うとき。
- フロントのPOSTフォームに、不正な送信を防ぐ確認を入れるとき。
save_postフックで、メタボックスの値を保存する前の確認。
よくあるミスと対処
- フォームに出力するだけで、受け取る側で検証していない。検証しなければ意味がありません。
- 出力側と検証側で、アクション名(第1引数)やフィールド名(第2引数)が違っている。
- nonceが、権限チェックの代わりになると考えている。nonceは「そのフォームから送られた」ことの確認で、権限の確認ではありません。
current_user_can()も併用します。 - ページキャッシュされるページにnonceを出力し、期限切れで検証に失敗する。nonceには有効期限があります(12〜24時間)。
NG例
// フォーム側にnonceを出力しているだけで、受け取り側で何も確認していない
wp_nonce_field( 'my_action', 'my_nonce' );
OK例
// フォーム側
wp_nonce_field( 'my_action', 'my_nonce' );
// 受け取り側
if ( ! isset( $_POST['my_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['my_nonce'] ) ), 'my_action' ) ) {
return;
}
使い分け早見表
| 場面 | 使うもの |
|---|---|
| フォームの中に、hiddenで出力する | wp_nonce_field() |
| リンクのURLに付ける | wp_nonce_url() |
| JavaScriptに渡す値を作る | wp_create_nonce() |
| 検証する(戻り値で判定) | wp_verify_nonce() |
| 検証する(管理画面。失敗時は処理を止める) | check_admin_referer() |
| 検証する(Ajax) | check_ajax_referer() |
関連項目
wp_create_nonce()、wp_verify_nonce()、wp_nonce_url()、check_admin_referer()、check_ajax_referer()
公式リファレンス:wp_nonce_field() | Function | WordPress Developer Resources

コメント