* } */ public static function settings(): array { $all = class_exists('\AKSRT\Settings\Settings') ? (array) \AKSRT\Settings\Settings::get_all() : []; $enabled = !isset($all['user_verify_enabled']) || !empty($all['user_verify_enabled']); $types_raw = (string) ($all['user_verify_apply_option'] ?? "real_name|实名认证\norganization|企业认证"); $types = []; foreach (preg_split('/\r\n|\r|\n/', $types_raw) as $line) { $line = trim($line); if ($line === '') { continue; } $parts = array_map('trim', explode('|', $line, 2)); $slug = sanitize_key($parts[0] ?? ''); $label = $parts[1] ?? $parts[0]; if ($slug === '') { continue; } $types[] = ['slug' => $slug, 'label' => (string) $label]; } return [ 'enabled' => $enabled, 'allow_apply' => !isset($all['user_verify_allow_apply']) || !empty($all['user_verify_allow_apply']), 'public_display' => !isset($all['user_verify_public_display']) || !empty($all['user_verify_public_display']), 'badge_text' => (string) ($all['user_verify_badge_text'] ?? __('已认证', 'aksrt')), 'limit_level' => max(0, (int) ($all['user_verify_limit_level'] ?? 0)), 'desc' => (string) ($all['user_verify_desc'] ?? ''), 'disable_desc' => (string) ($all['user_verify_disable_desc'] ?? ''), 'types' => $types, ]; } public static function get_status(int $user_id): string { if ($user_id <= 0) { return ''; } return sanitize_key((string) get_user_meta($user_id, self::STATUS_META, true)); } public static function is_verified(int $user_id): bool { return self::get_status($user_id) === 'verified'; } /** * @return array */ public static function get_auth_info(int $user_id): array { $info = get_user_meta($user_id, self::INFO_META, true); return is_array($info) ? $info : []; } /** * @return array */ public static function get_apply_payload(int $user_id): array { $apply = get_user_meta($user_id, self::APPLY_META, true); return is_array($apply) ? $apply : []; } public function ajax_apply(): void { if (!is_user_logged_in()) { wp_send_json(['error' => 1, 'msg' => __('请先登录', 'aksrt')]); } if (!check_ajax_referer('aksrt_user_auth_apply', '_wpnonce', false)) { wp_send_json(['error' => 1, 'msg' => __('安全校验失败', 'aksrt')]); } $user_id = get_current_user_id(); $s = self::settings(); if (!$s['enabled'] || !$s['allow_apply']) { wp_send_json(['error' => 1, 'msg' => __('暂不能申请身份认证', 'aksrt')]); } if (self::is_verified($user_id)) { wp_send_json(['error' => 1, 'msg' => __('您已是认证用户', 'aksrt')]); } if (self::get_status($user_id) === 'pending') { wp_send_json(['error' => 1, 'msg' => __('您的申请正在审核中', 'aksrt')]); } if ($s['limit_level'] > 0 && class_exists('\AKSRT\User\Level')) { $lv = (int) Level::get_level($user_id); if ($lv < $s['limit_level']) { wp_send_json([ 'error' => 1, 'msg' => sprintf( /* translators: %d: required level */ __('等级不足,需达到 LV.%d 后申请', 'aksrt'), $s['limit_level'] ), ]); } } $name = isset($_POST['name']) ? sanitize_text_field(wp_unslash((string) $_POST['name'])) : ''; $desc = isset($_POST['desc']) ? sanitize_textarea_field(wp_unslash((string) $_POST['desc'])) : ''; $msg = isset($_POST['msg']) ? sanitize_textarea_field(wp_unslash((string) $_POST['msg'])) : ''; $type = isset($_POST['type']) ? sanitize_key((string) wp_unslash($_POST['type'])) : ''; if ($name === '') { wp_send_json(['error' => 1, 'msg' => __('请填写认证身份名称', 'aksrt')]); } $images = []; if (!empty($_FILES['image']['name'])) { require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; $files = $_FILES['image']; // Normalize multi-file upload. $names = $files['name']; if (!is_array($names)) { $names = [$names]; $tmp = [ 'name' => $names, 'type' => [$files['type']], 'tmp_name' => [$files['tmp_name']], 'error' => [$files['error']], 'size' => [$files['size']], ]; $files = $tmp; } $count = min(3, count($files['name'])); for ($i = 0; $i < $count; $i++) { if (empty($files['name'][$i]) || (int) $files['error'][$i] !== UPLOAD_ERR_OK) { continue; } $file = [ 'name' => $files['name'][$i], 'type' => $files['type'][$i], 'tmp_name' => $files['tmp_name'][$i], 'error' => $files['error'][$i], 'size' => $files['size'][$i], ]; $_FILES['aksrt_auth_img'] = $file; $aid = media_handle_upload('aksrt_auth_img', 0); if (!is_wp_error($aid)) { $url = wp_get_attachment_url((int) $aid); if ($url) { $images[] = $url; } } } unset($_FILES['aksrt_auth_img']); } $payload = [ 'name' => $name, 'desc' => $desc, 'msg' => $msg, 'type' => $type, 'img' => $images, 'time' => current_time('Y-m-d H:i'), ]; update_user_meta($user_id, self::APPLY_META, $payload); update_user_meta($user_id, self::STATUS_META, 'pending'); delete_user_meta($user_id, self::REASON_META); /** * @param int $user_id * @param array $payload */ do_action('aksrt_user_auth_apply_submitted', $user_id, $payload); wp_send_json([ 'error' => 0, 'msg' => __('提交成功,请等待管理员审核', 'aksrt'), 'reload' => true, ]); } }