TL;DR - 为什么在wp admin内部发出的AJAX请求期间,我的用户帐户没有登录?
我有以下设置:
<?php
add_action(\'wp_ajax_foobar_action\', \'foobar_action\');
add_action(\'wp_ajax_nopriv_foobar_action\', \'foobar_action\');
function foobar_action() {
check_ajax_referrer();
wp_send_json((object) [\'msg\' => \'hello world\']);
}
add_action(\'admin_print_scripts\', function () {
printf(\'<script type="text/javascript">window.custom_nonce = "%s";</script>\', wp_create_nonce());
});
在JS中:
var msg = \'\';
// I\'m using the whatwg-fetch polyfill and a polyfill for Promises.
fetch(ajaxurl, {
method: \'POST\',
headers: {
\'Content-Type\': \'application/x-www-form-urlencoded; charset=utf-8\'
},
body: \'action=foobar_action&_wpnonce=\' + window.custom_nonce
}).then(function (res) {
msg = res.json().msg;
});
这都是在wp admin中运行的。问题是wp admin page/JS脚本本身是作为登录用户加载的,但AJAX请求最终会加载到admin AJAX中。php是作为注销的来宾用户完成的。这导致了使用wp admin的问题
nopriv
和
check_ajax_referrer
百分百失败。
为什么wp admin以来宾身份而不是登录用户的身份发出AJAX请求?
当前,AJAX端点返回403
状态为-1
内容,以防出现nonce不匹配。如果我把check_ajax_referrer()
调用,然后AJAX请求成功运行。愤怒之后console.log
我已经确定,在JS fetch调用中,nonce值与接收它的AJAX端点相匹配(这意味着nonce已正确传输,但在AJAX端点执行期间生成了错误的来宾nonce)。
如果我删除wp_ajax_nopriv_foobar_action
然后WordPress找不到启用身份验证的AJAX操作,因为似乎没有可用的登录用户(导致状态为200
和车身0
).
我尝试解决此问题的步骤:
注销并再次登录,清除缓存/cookie,使用匿名windows,重新启动PHP-FPM、Nginx、对象缓存后端、MariaDB,禁用所有操作不需要的插件,将AJAX挂接代码在我的插件代码中移动,一直移动到插件根文件(例如。myplugin/myplugin.php
),使用GET代替POST