WordPress仪表盘小部件邮件发送REST API回调未触发求助
可能导致REST API回调未触发的问题及修复方案
1. 路由权限验证缺失或错误
WordPress REST API会拦截未通过权限验证的请求,若路由未设置permission_callback,或验证逻辑返回false,请求会直接被拒绝,回调无法执行。
修复示例:
注册路由时指定适配仪表盘场景的权限回调,确保仅登录用户可访问:
add_action('rest_api_init', function() { register_rest_route( 'dashboard-widget/v1', // 自定义命名空间 '/submit-ticket', // 路由路径 array( 'methods' => 'POST', 'callback' => 'submit_support_ticket', 'permission_callback' => function() { // 验证当前用户已登录且具备仪表盘访问权限 return is_user_logged_in() && current_user_can('read'); } ) ); });
2. 前端请求未携带有效Nonce
后台请求必须验证WordPress的nonce,否则REST API会返回403错误,无法触发回调。需在小部件HTML中输出nonce,并在fetch请求中携带。
修复步骤:
- 小部件HTML中添加隐藏nonce字段:
// 输出仪表盘小部件内容时 wp_nonce_field('wp_rest', 'dashboard_ticket_nonce');
- 前端fetch请求携带nonce到请求头:
const form = document.querySelector('#your-ticket-form'); form.addEventListener('submit', async (e) => { e.preventDefault(); const nonce = document.querySelector('#dashboard_ticket_nonce').value; const formData = new FormData(form); const response = await fetch('/wp-json/dashboard-widget/v1/submit-ticket', { method: 'POST', headers: { 'X-WP-Nonce': nonce }, body: formData }); const result = await response.json(); // 后续处理响应逻辑 });
3. 路由路径或命名空间不匹配
若前端请求URL与注册的路由信息不一致,会返回404错误,回调无法执行。
检查方法:
访问站点根目录下的wp-json/路径,查看已注册的REST路由列表,确认你的路由命名空间、路径是否与前端请求一致。
4. 请求方法不匹配
注册路由时指定的methods与前端fetch方法不一致,比如后端仅允许POST但前端用了GET,或后端未指定methods(默认是GET),前端POST请求会被拒绝。
修复示例:
注册路由时明确指定请求方法为POST:
'methods' => WP_REST_Server::CREATABLE, // 等价于POST
5. 回调函数定义错误
若submit_support_ticket函数未定义,或注册路由时函数名拼写错误,WordPress无法找到回调逻辑。
修复示例:
确保函数已正确定义,且与路由注册时的callback参数完全一致:
function submit_support_ticket(WP_REST_Request $request) { // 获取表单数据 $form_data = $request->get_params(); // 发送邮件逻辑 $to = 'support@example.com'; $subject = '新支持工单提交'; $message = '提交内容:' . print_r($form_data, true); wp_mail($to, $subject, $message); return rest_ensure_response(['status' => 'success']); }
6. 前端请求URL格式错误
若站点安装在子目录下,使用相对路径发起fetch请求会出错。建议通过本地化脚本传递正确的REST API根路径。
修复示例:
注册脚本时传递REST URL变量:
add_action('admin_enqueue_scripts', function() { wp_enqueue_script('dashboard-ticket-script', get_template_directory_uri() . '/js/dashboard-ticket.js', ['wp-api'], '1.0', true); wp_localize_script('dashboard-ticket-script', 'dashboardTicketData', [ 'restUrl' => get_rest_url(), 'nonce' => wp_create_nonce('wp_rest') ]); });
前端使用变量构建请求URL:
const url = dashboardTicketData.restUrl + 'dashboard-widget/v1/submit-ticket';
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

