我正在开发一个简单的Ajax函数,作为插件的一部分,该插件旨在从传统的WP Admin仪表板中使用,但在登录cookie状态方面遇到了分歧。
The problem, TL;DR version
Ajax调用的输出总是在注销用户的上下文中运行。明确地
get_current_user_id()
退货
0
对于所有Ajax启动的调用,尽管有PHP端
var_dump(get_current_user_id())
在页面本身的输出上返回正确的登录用户ID号。
正在检查document.cookie
似乎确认JS端没有登录cookie,但var_dump($_COOKIE)
显示正确的登录cookie。
更奇怪的是,Firefox的网络窗格显示了完整的cookie以及登录值,这些cookie是通过Ajax调用发送给WordPress的。
有什么好处?
Code & context
加载某个WP admin dashboard页面时,我的JS只需轮询WP-API(v2)以获取给定帖子的评论。轮询方法如下所示:
/**
* Checks for any new comments.
*/
var pollForNewComments = function () {
var url = api_base + \'/comments&post=\' + getPostId() + \'&offset=\' + getCommentCount();
console.log(document.cookie);
jQuery.get(url, function (response) {
if (response.length) {
appendComments(response);
showNewCommentsNotice();
}
});
};
记下呼叫
console.log(document.cookie)
. 此方法运行时,控制台日志的输出显示以下输出:
wordpress_test_cookie=WP+Cookie+check; wp-settings-time-10=1456479389; popunder=yes; popundr=yes; setover18=1
请注意,没有登录cookie。
但是,对于同一调用,Firefox网络窗格显示登录cookie是否存在于HTTP请求头中:
为了验证WordPress是否接收到登录cookie,我执行了一个
var_dump(get_current_user_id()); var_dump($_COOKIE); exit();
在我的插件代码中,Ajax调用的输出证实,尽管存在登录cookie,WordPress认为没有登录用户:
int(0)
array(3) {
["wordpress_test_cookie"]=>
string(15) "WP Cookie check"
["wordpress_logged_in_9416a7b43bd88dae58cf6c88b9f89f3f"]=>
string(130) "athirduser|1456650402|a23GIhs43jJ651dKkCEKfX6EKjfnTCpT76k6Hgvznls|5da91c9c365cf214c486b0a32333a78fb6394385e5bcad619666511330322bda"
["wp-settings-time-10"]=>
string(10) "1456479389"
}
非Ajax调用的输出将正确返回,同时显示登录cookieis和返回的正确用户ID。
为什么这里Ajax调用和非Ajax调用之间存在差异?为什么console.log(document.cookie)
Firefox在其网络检查器中显示了什么?
这是一个单服务器设置,一个本地开发环境,而不是跨域请求。
谢谢