1. ホーム
  2. wordpress

[解決済み] WordPress: wp_create_nonce() がカスタムプラグインの内部に値を作成しない。

2022-03-12 07:23:28

質問

ユーザー登録のためのカスタムプラグインを以下の手順で作成しています。

HTMLフォームフィールドを作成するための関数

function render_registration_form() {
   ob_start();
   ...
   <input type="hidden" id="register_nonce" name="register_nonce" value="<?php wp_create_nonce('generate-nonce'); ?>" />
   //Above line does not create a nonce at all
   ...
   return ob_get_clean();
}

上記のフォームを表示するためのショートコードとして使用する関数です。

function custom_user_registration_form() {
   //Render registration form only if user is not logged in already!
   if(!is_user_logged_in()) {
       $registration_enabled = get_option('users_can_register');
       if($registration_enabled) {
           $output = render_registration_form(); (written above)
       } else {
           $output = __('User registration is not enabled');
       }

       return $output;
   } else {
       return _e('You are already logged in!');
   }
}

add_shortcode('register-user', 'custom_user_registration_form');

新しいユーザーを検証し、メタデータと一緒にデータベースに追加する関数です。

function validate_and_create_user() {
   if(isset($_POST['txt_username']) && wp_verify_nonce($_POST['register_nonce'], 'register-nonce')) {
   $user_data = array(
     'user_login' => $loginid,
     'user_pass' => $password,
     'user_nicename' => $first_name,
     'display_name' => $first_name . ' ' . $last_name,
     'user_email' => $email,
     'first_name' => $first_name,
     'last_name' => $last_name,
     'user_registered' => date('Y-m-d H:i:s'),
     'role' => 'subscriber'
     );

     $new_user_id = wp_insert_user($user_data);

     ...
}

add_action('init', 'validate_and_create_user');

がないため nonce の値はフォームの内部で作成されるため、チェックボックスの wp_verify_nonce($_POST['register_nonce'], 'register-nonce') は常に失敗し、ユーザーデータはデータベースに保存されません。

によると https://codex.wordpress.org/Pluggable_Functions

WordPressコアにプラグイン可能な関数が追加されなくなりました。新しい関数はすべて出力にフィルタを使用し、同様の機能をオーバーライドできるようになりました。

私はWordPressの初心者です。どうすればいいのか見当もつきません。何か手助けがあれば、とても助かります。

解決方法は?

これを試してみてください。

wp_nonce_field('register_nonce');

を入力の代わりにしてください。

また、nonceを取得するためには、次のようにします。

$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'register_nonce')) die( 'Failed security check' );