我已经为我的插件实现了一些AJAX功能,只要我没有以管理员身份登录,它就可以正常工作wp_verify_nonce 失败。它适用于未经授权的用户和授权的普通用户。
这是我的PHP类(我删除了与问题无关的所有内容):
class My_Ajax {
function __construct() {
add_action( \'wp_ajax_geoip_citylist\', array($this, \'geoip_citylist\') );
add_action( \'wp_ajax_nopriv_geoip_citylist\', array($this, \'geoip_citylist\') );
add_action( \'wp_enqueue_scripts\', array($this, \'geoip_localize_js\'), 11 );
}
function geoip_citylist() {
if ( ! wp_verify_nonce($_POST[\'geoipNonce\'], \'my_geoip_nonce\') ) {
exit(\'Wrong nonce: \' . $_POST[\'geoipNonce\']);
}
}
function geoip_localize_js() {
wp_localize_script(
\'my_custom_js\', \'myGeoipAjaxObject\',
array(
\'myGeoipNonce\' => wp_create_nonce(\'my_geoip_nonce\')
)
);
}
}
下面是我的Javascript:
$.ajax({
url: myMainAjaxObject.ajaxUrl,
type: \'POST\',
dataType: \'json\',
data: {
geoipNonce: myGeoipAjaxObject.myGeoipNonce,
action: "geoip_citylist"
},
success: function(data) {
replacePhones(data.user_city, data.current_phone, data.city_list);
},
error: function(error) {
console.log(error);
}
});
PHP错误响应中的nonce似乎是正确的,但由于某些原因,它仍然无法验证。
我花了几天的时间试图找出问题所在,并尝试用各种可能的方式在谷歌上搜索,但到目前为止,我找不到一个可行的解决方案。stackoverflow上也有类似的问题,如this one 创建于2011年。。。我可以假设nonces不适用于Wordpress中的管理员帐户,但我想在放弃之前至少得到一个确认。
UPDATE:我试着只使用我在这里提供的代码,结果仍然是相同的错误(我还仔细检查了缓存,它被刷新了)。
UPDATE 2:myMainAjaxObject 及其ajaxUrl 插入到另一个脚本中。由于每个AJAX请求的AJAX URL都是相同的,所以我只使用全局URL,而不是每次都重新定义它。所以这不是导致错误的原因。而且,如果它不被定义,它将永远不会起作用。再一次,它不仅适用于管理员,对于其他用户和未经授权的用户,它也可以正常工作。当我以管理员身份登录时,我确实在服务器响应中得到了“错误的nonce:73dd02f662”。所以我百分之百确定URL是正确的。