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

WordPress前端AJAX删除文章请求返回403/401错误求助

WordPress前端调用REST API删除文章返回401/403故障排查

问题描述

开发前端文章删除功能时遇到权限报错,初始实现代码如下:

jQuery(document).ready(function() {
    jQuery('.delete-listing-btn').on('click', function() {
        jQuery.ajax({
            beforeSend: (xhr) => {
                xhr.setRequestHeader('X-WP-Nonce', favorites_data.nonce);
        },
            url: 'https://www.mallorca-select.com/wp-json/wp/v2/properties-for-sale/2303',
            type: 'DELETE',
            success: (response) =>{
                console.log("COngratus");
                console.log(response);
            },
            error: (response) => {
                console.log("Fail");
                console.log(response);
            }
        });
    });
});

测试时的报错规律:

  • 不携带nonce参数发起请求,接口返回401未授权错误
  • 携带nonce参数发起请求,接口返回403禁止访问错误

相关报错截图:
报错截图1
报错截图2

故障原因与修复方案

按优先级逐一排查以下问题即可解决:

  • Nonce生成规则不匹配
    WordPress REST API 校验的X-WP-Nonce必须以wp_rest为动作生成,你当前调用的favorites_data.nonce如果是为收藏等其他功能生成的nonce,无法通过REST API的权限校验。
    需要在PHP端按规则生成nonce并本地化到前端,参考代码:
    // 放入主题functions.php或对应功能插件文件
    function register_delete_assets() {
        wp_enqueue_script( 'custom-delete', get_stylesheet_directory_uri() . '/js/delete.js', ['jquery'], '1.0', true );
        // 注意wp_create_nonce的参数必须固定为'wp_rest'
        wp_localize_script( 'custom-delete', 'favorites_data', [
            'nonce' => wp_create_nonce( 'wp_rest' )
        ]);
    }
    add_action( 'wp_enqueue_scripts', 'register_delete_assets' );
    
  • JS代码语法错误
    你贴出的代码中beforeSend回调的大括号没有正确闭合,和后续参数层级错乱,会导致请求头设置不生效。另外建议接口地址用相对路径避免跨域问题,修正后的JS代码如下:
    jQuery(document).ready(function() {
        jQuery('.delete-listing-btn').on('click', function() {
            jQuery.ajax({
                beforeSend: (xhr) => {
                    xhr.setRequestHeader('X-WP-Nonce', favorites_data.nonce);
                }, // 补全回调闭合
                url: '/wp-json/wp/v2/properties-for-sale/2303', // 替换为相对路径
                type: 'DELETE',
                success: (response) =>{
                    console.log("删除成功", response);
                },
                error: (response) => {
                    console.log("删除失败", response);
                }
            });
        });
    });
    
  • 当前用户权限不足
    WordPress REST API 删除文章默认要求当前登录用户拥有对应文章类型的删除权限:如果要删除的是他人发布的房源,需要delete_others_posts权限;删除自己发布的房源需要delete_posts权限。普通订阅者角色默认没有上述权限,哪怕nonce正确也会返回403。可以在控制台查看当前登录用户的角色和权限配置,给需要操作的用户分配对应角色即可。
  • 自定义文章类型REST配置错误
    如果你是自行注册的properties-for-sale自定义文章类型,需要确认注册时show_in_rest参数设为true,同时REST接口的权限回调没有拦截合法的删除请求,不要将DELETE请求的权限回调设为强制返回false。

内容的提问来源于stack exchange,提问作者Gabriele Cettolin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:15:26