'phone_number', 'meta_value' => $login, 'number' => 1, ]); if (!empty($users[0]) && $users[0] instanceof \WP_User) { return $users[0]->user_login; } } if (is_email($login)) { $user = get_user_by('email', $login); if ($user && !is_wp_error($user)) { return $user->user_login; } } return sanitize_user($login, true); } public static function friendly_login_error(string $raw_message): string { $msg_lower = wp_strip_all_tags(strtolower($raw_message)); if (false !== strpos($msg_lower, 'incorrect password') || false !== strpos($msg_lower, '密码不正确')) { return __('用户名或密码错误,请重新输入', 'aksrt'); } if ( false !== strpos($msg_lower, 'invalid username') || false !== strpos($msg_lower, 'invalid email') || false !== strpos($msg_lower, 'error: 该用户不存在') ) { return __('账号不存在,请检查输入或先注册', 'aksrt'); } if ( false !== strpos($msg_lower, 'empty_password') || false !== strpos($msg_lower, 'empty username') || false !== strpos($msg_lower, 'empty') ) { return __('请填写用户名和密码', 'aksrt'); } return sprintf(__('登录失败:%s', 'aksrt'), wp_strip_all_tags($raw_message)); } public static function mark_verified_email(int $user_id): void { self::mark_email_verified($user_id); } public static function validate_password(string $password, string $confirm = '') { if ($password === '') { return __('请输入密码', 'aksrt'); } if (mb_strlen($password) < 6) { return __('密码长度至少6位', 'aksrt'); } if (mb_strlen($password) > 128) { return __('密码过长,请控制在128位以内', 'aksrt'); } if ($confirm !== '' && $password !== $confirm) { return __('两次输入的密码不一致', 'aksrt'); } return true; } public static function login_user(array $post): array { $resolved_login = self::resolve_email_to_username((string) ($post['log'] ?? '')); $creds = [ 'user_login' => $resolved_login, 'user_password' => (string) ($post['pwd'] ?? ''), 'remember' => !empty($post['rememberme']), ]; $original_post = $_POST; $_POST = array_merge($_POST, $post); try { $user = wp_signon($creds); } finally { $_POST = $original_post; } if (is_wp_error($user)) { return ['success' => false, 'error' => self::friendly_login_error($user->get_error_message())]; } // REST API 上下文中 wp_signon 可能无法正确设置 Cookie // 手动调用 wp_set_auth_cookie 确保 Cookie 被设置 if (defined('REST_REQUEST') && REST_REQUEST) { wp_set_auth_cookie($user->ID, !empty($post['rememberme'])); wp_set_current_user($user->ID); } $redirect = !empty($post['redirect_to']) ? wp_unslash((string) $post['redirect_to']) : home_url('/'); $redirect = wp_validate_redirect($redirect, home_url('/')); return [ 'success' => true, 'user' => $user, 'redirect' => $redirect, ]; } }