【问题标题】:WordPress: wp_create_nonce() not creating a value inside custom pluginWordPress:wp_create_nonce() 未在自定义插件中创建值
【发布时间】:2017-07-26 06:36:40
【问题描述】:

我正在通过以下步骤创建一个用于用户注册的自定义插件:

创建我的 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 新手。不知道如何解决这个问题!任何帮助都会对我有很大帮助。

【问题讨论】:

    标签: wordpress nonce


    【解决方案1】:

    试试这个:

    wp_nonce_field('register_nonce');
    

    代替输入。

    为了检索随机数,请使用以下

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

    【讨论】:

    • 太棒了!工作就像一个魅力:) 完美而中肯的答案。非常感谢。
    • 但是,问题是注册 nonce 字段和在文本框中分配 nonce 值有什么区别?为什么我的方法不起作用?
    • 因为 wp_create_nonce( 'my-nonce' ) 它自己创建一个元素,所以不需要使用输入
    • 我明白这一点。但是为什么wp_create_nonce 不能使用自定义输入让我感到困扰:) 如果你能解释一下,那就太好了。
    • 试试这个!我认为您忘记添加 echo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多