如何使用WP REST API进行新用户注册(注册表)?

时间:2017-04-25 作者:William78

是否可以创建一个可以通过WP REST API工作的注册表单,以便访问者能够在我的网站上创建帐户?

我可以创建这样的表单并使用它创建新用户。当我以管理员身份登录时,这将与wp\\u rest nonce一起工作。

但是,如果有未登录的访问者,同样的表单当然不起作用。我认为这是一个身份验证问题。你能给我一个大概的建议吗?如何允许访问者注册REST API?

5 个回复
SO网友:Jack Song

希望你已经找到了答案。这是我们的解决方案,供您参考:D

下面的代码应该通过RESTAPI将用户注册添加到WordPress网站。它支持注册“订户”和“客户”。

将其添加到函数中。php

add_action(\'rest_api_init\', \'wp_rest_user_endpoints\');
/**
 * Register a new user
 *
 * @param  WP_REST_Request $request Full details about the request.
 * @return array $args.
 **/
function wp_rest_user_endpoints($request) {
  /**
   * Handle Register User request.
   */
  register_rest_route(\'wp/v2\', \'users/register\', array(
    \'methods\' => \'POST\',
    \'callback\' => \'wc_rest_user_endpoint_handler\',
  ));
}
function wc_rest_user_endpoint_handler($request = null) {
  $response = array();
  $parameters = $request->get_json_params();
  $username = sanitize_text_field($parameters[\'username\']);
  $email = sanitize_text_field($parameters[\'email\']);
  $password = sanitize_text_field($parameters[\'password\']);
  // $role = sanitize_text_field($parameters[\'role\']);
  $error = new WP_Error();
  if (empty($username)) {
    $error->add(400, __("Username field \'username\' is required.", \'wp-rest-user\'), array(\'status\' => 400));
    return $error;
  }
  if (empty($email)) {
    $error->add(401, __("Email field \'email\' is required.", \'wp-rest-user\'), array(\'status\' => 400));
    return $error;
  }
  if (empty($password)) {
    $error->add(404, __("Password field \'password\' is required.", \'wp-rest-user\'), array(\'status\' => 400));
    return $error;
  }
  // if (empty($role)) {
  //  $role = \'subscriber\';
  // } else {
  //     if ($GLOBALS[\'wp_roles\']->is_role($role)) {
  //      // Silence is gold
  //     } else {
  //    $error->add(405, __("Role field \'role\' is not a valid. Check your User Roles from Dashboard.", \'wp_rest_user\'), array(\'status\' => 400));
  //    return $error;
  //     }
  // }
  $user_id = username_exists($username);
  if (!$user_id && email_exists($email) == false) {
    $user_id = wp_create_user($username, $password, $email);
    if (!is_wp_error($user_id)) {
      // Ger User Meta Data (Sensitive, Password included. DO NOT pass to front end.)
      $user = get_user_by(\'id\', $user_id);
      // $user->set_role($role);
      $user->set_role(\'subscriber\');
      // WooCommerce specific code
      if (class_exists(\'WooCommerce\')) {
        $user->set_role(\'customer\');
      }
      // Ger User Data (Non-Sensitive, Pass to front end.)
      $response[\'code\'] = 200;
      $response[\'message\'] = __("User \'" . $username . "\' Registration was Successful", "wp-rest-user");
    } else {
      return $user_id;
    }
  } else {
    $error->add(406, __("Email already exists, please try \'Reset Password\'", \'wp-rest-user\'), array(\'status\' => 400));
    return $error;
  }
  return new WP_REST_Response($response, 123);
}
依我看,更好的方法是将附加功能作为一个单独的插件。因此,即使用户更改了主题,api调用也不会受到影响。

因此我开发了plugin 用于通过WordPress中的REST API进行用户注册。更好的是,它还支持为WooCommerce创建“客户”!

WP REST User, 如果你想的话就去看看吧。

SO网友:JSP

您可以使用创建自己的注册例程wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php (WP v4.7.4)作为参考实施。您还可以通过执行以下操作来修改WordPress版本:

function nLbwuEa8_modify_create_user_route() {
    $users_controller = new WP_REST_Users_Controller();

    register_rest_route( \'wp/v2\', \'/users\', array(
        array(
            \'methods\'             => WP_REST_Server::CREATABLE,
            \'callback\'            => array($users_controller, \'create_item\'),
            \'permission_callback\' => function( $request ) {

                // METHOD 1: Silently force the role to be a subscriber
                // $request->set_param(\'roles\', array(\'subscriber\'));

                // METHOD 2: Be nice and provide an error message
                if ( ! current_user_can( \'create_users\' ) && $request[\'roles\'] !== array(\'subscriber\')) {

                    return new WP_Error(
                        \'rest_cannot_create_user\',
                        __( \'Sorry, you are only allowed to create new users with the subscriber role.\' ),
                        array( \'status\' => rest_authorization_required_code() )
                    );

                }

                return true;
            },
            \'args\'                => $users_controller->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
        ),
    ) );

} );
add_action( \'rest_api_init\', \'nLbwuEa8_modify_create_user_route\' );
重要的部分是permission_callback 密钥(基本上禁用身份验证)。以及args 密钥,可用于添加验证码,以便垃圾邮件发送者不会溢出服务。希望这有帮助。

SO网友:Shawn H

我将为您的站点创建一个自定义路由,该路由收集您需要的字段,然后调用内部wp\\u insert\\u user()函数。这样,您就可以验证用户提供的信息,包括限制允许他们获得的角色。我还想限制一天内由相同IP地址创建的用户数,或者类似的。

SO网友:riot

现在有一个插件叫做WP Webhooks 可以做到这一点。

根据插件页面:

它允许您在从其他服务接收数据时在WordPress中触发操作(例如创建用户或帖子)。

许多表单解决方案都与Zapier(包括Gravity表单、JotForm、Forgible,甚至Google表单)配合使用,因此其中一个可用于触发使用此方法注册的新用户。

Wordpress已具有native Zapier support 如果没有此插件,但使用本机WordPress Zapier应用程序创建新用户是不受支持的操作。

SO网友:Mozart AlKhateeb

尝试WP REST User 它具有创建用户和重置密码功能