自定义列表拖拽三行调整顺序,松手后弹出“更新失败”,控制台显示 403,刷新后顺序回到原样。乍看像缓存或者权限的锅,追下去往往不是。

wp_localize_script('book-sort', 'BookSort', ['nonce' => wp_create_nonce('book_sort')]);
fetch(ajaxurl, {method: 'POST', body: new URLSearchParams({action: 'book_sort', nonce: BookSort.nonce, order: ids.join(',')})});

追下去是这么回事:拖拽走 admin-ajax,前端只提交了 order 数组,没有带 nonce,回调里的 check_ajax_referer 校验失败直接终止。请求方法还是 GET,部分安全插件会额外拦一次。

「后台拖拽排序 403」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,用 wp_localize_script 把 nonce 输出到前端;请求体里带上 nonce 字段;回调里先校验 nonce 再判断权限。

验收就看一点,拖拽后提示保存成功,刷新页面顺序保持不变,换账号也没有 403。

作者 9823189