WordPress Gravity Form:无法获取AWS返回的答题正确率并展示
解决Gravity Forms REST API 401权限错误及前端展示答题正确率问题
一、401权限错误的核心原因及修复步骤
1. 检查API密钥权限
Gravity Forms REST API的权限是细粒度控制的,你当前的401错误大概率是API密钥未分配条目读取权限:
- 登录WordPress后台,进入「Gravity Forms > 设置 > REST API」
- 找到你创建的API密钥,点击编辑,确保勾选「Entries > Read」权限(对应权限标识
entries_read)
2. 验证Basic Auth编码正确性
Basic Auth的格式是Consumer Key:Consumer Secret拼接后做Base64编码,你需要确认:
- 编码字符串是「API密钥的Consumer Key」+ 冒号 +「API密钥的Consumer Secret」,没有搞反或遗漏字符
- 重新生成编码替换原有
Authorization头的值,比如用终端命令生成:echo -n "你的Consumer Key:你的Consumer Secret" | base64
3. 优化curl请求(过滤特定条目)
直接请求所有条目会返回大量数据,且权限要求更高,建议添加过滤参数只获取当前用户的最新提交:
curl -X GET https://reproductivehealth.adrianmiddletonfwd.co.uk/wp-json/gf/v2/entries?search={"field_filters":[{"key":"created_by","value":"当前用户ID"}],"sorting":[{"key":"date_created","direction":"DESC"}],"paging":{"page_size":1}} -H 'Authorization: Basic 正确的Base64编码值' -H 'Content-Type: application/json'
二、前端展示正确率的更优方案(绕过REST API权限问题)
直接调用GF的REST API存在密钥泄露风险,更安全的方式是利用GF的钩子在提交时存储分数,再在成功页面读取展示:
1. 存储分数到用户元数据/会话
将以下代码添加到主题的functions.php文件中:
add_action('gform_after_submission', 'save_quiz_score', 10, 2); function save_quiz_score($entry, $form) { // 替换为AWS返回正确率实际存储的字段键(比如自定义字段的ID对应键,如'field_10') $correct_rate = $entry['field_10']; // 登录用户存储到元数据,游客存储到会话 if (is_user_logged_in()) { update_user_meta(get_current_user_id(), 'quiz_correct_rate', $correct_rate); } else { session_start(); $_SESSION['quiz_correct_rate'] = $correct_rate; } }
2. 在提交成功页面展示分数
在成功页面的模板中添加以下代码:
<?php $correct_rate = ''; if (is_user_logged_in()) { $correct_rate = get_user_meta(get_current_user_id(), 'quiz_correct_rate', true); // 可选:展示后清空存储,避免重复显示 delete_user_meta(get_current_user_id(), 'quiz_correct_rate'); } else { session_start(); $correct_rate = isset($_SESSION['quiz_correct_rate']) ? $_SESSION['quiz_correct_rate'] : ''; unset($_SESSION['quiz_correct_rate']); } if ($correct_rate) { echo "<p>你的答题正确率:{$correct_rate}%</p>"; } ?>
三、若必须使用REST API的安全中转方案
如果一定要通过API获取,不要直接暴露GF的API密钥,而是创建自定义REST端点做中转:
add_action('rest_api_init', 'register_custom_quiz_score_endpoint'); function register_custom_quiz_score_endpoint() { register_rest_route('custom/v1', '/quiz-score', [ 'methods' => 'GET', 'callback' => 'get_user_quiz_score', 'permission_callback' => function() { // 权限控制:仅允许当前用户查看自己的分数 return is_user_logged_in() || isset($_COOKIE['gform_submission_' . $form_id]); } ]); } function get_user_quiz_score(WP_REST_Request $request) { $form_id = 1; // 替换为你的表单ID $user_id = get_current_user_id(); // 通过GFAPI获取当前用户最新提交 $entries = GFAPI::get_entries([ 'field_filters' => [ ['key' => 'created_by', 'value' => $user_id], ['key' => 'form_id', 'value' => $form_id] ], 'sorting' => ['key' => 'date_created', 'direction' => 'DESC'], 'paging' => ['page_size' => 1] ]); if (!empty($entries)) { $score = $entries[0]['field_10']; // 替换为存储分数的字段键 return new WP_REST_Response(['correct_rate' => $score], 200); } else { return new WP_REST_Response(['message' => '未找到答题记录'], 404); } }
前端直接调用自定义端点:https://你的域名/wp-json/custom/v1/quiz-score,无需携带API密钥。
内容的提问来源于stack exchange,提问作者robothead
相关产品推荐
相关产品推荐

