You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:19