为什么在使用AJAX时,GET_CURRENT_USER_ID()和Document.cookie的输出之间会有奇怪的差异?

时间:2016-02-26 作者:M12

我正在开发一个简单的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请求头中:

Firefox Network Panel screenshot shows login cookie, even though earlier console.log() call does not???

为了验证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在其网络检查器中显示了什么?

这是一个单服务器设置,一个本地开发环境,而不是跨域请求。

谢谢

1 个回复
SO网友:M12

我不得不通过WordPress内核和RESTAPI插件代码来修复这个问题,但最终还是做到了。这个solution is described here.

TL;解决方案的关键在于,除非在_wpnonce HTTP协议GET 参数(在查询字符串中)或HTTP_X_WP_NONCE HTTP标头。我的JavaScript没有正确地包含此内容。更正后的JavaScript方法如下所示:

/**     
 * Checks for any new comments.
 */     
var pollForNewComments = function () {
    var url = api_base + \'/comments&post=\' + getPostId() + \'&offset=\' + getCommentCount()
        + \'&_wpnonce=\' + wpApiSettings.nonce;
    jQuery.get(url, function (response) {
        if (response.length) {
            appendComments(response);
            showNewCommentsNotice();
        }
    });
};
请注意,添加_wpnonce 查询字符串中的参数wpApiSettings.nonce 全局JavaScript变量(由RESTAPI插件添加)为我解决了这个问题。

相关推荐

将用户从wp-admin(而不是管理员)重定向

我想重定向除管理员以外的所有用户,使其远离wp admin页面如果登录用户尝试访问/wp admin,则他们将被重定向回主页现在他们看到一个页面,上面写着;抱歉,不允许您访问此页面<你们能帮我在函数中构造一个函数吗。php文件来检查这些条件并重定向<这就是我所拥有的,它并不是为了我想要的。function acme_login_redirect( $redirect_to, $request, $user ) { return ( is_array( $user->role