WP REST Api/AJAX POST在未登录时不工作

时间:2017-03-24 作者:jDelforge

遵循Wordpress documentation about the Rest Api, 我可以设法使ajax帖子正常工作,但只有在登录Wordpress时。以下是文档中显示的基本文件:

功能。php

wp_localize_script( \'wp-api\', \'wpApiSettings\', array(
    \'root\' => esc_url_raw( rest_url() ),
    \'nonce\' => wp_create_nonce( \'wp_rest\' )
) );
应用程序。js公司
$.ajax( {
    url: wpApiSettings.root + \'wp/v2/posts/1\',
    method: \'POST\',
    beforeSend: function ( xhr ) {
        xhr.setRequestHeader( \'X-WP-Nonce\', wpApiSettings.nonce );
    },
    data:{
        \'title\' : \'Hello Moon\'
    }
} ).done( function ( response ) {
    console.log( response );
} );
我正在展示这个示例,因为它是一个简单的示例,但是not working 未登录时。它总是给我401个未经授权的响应/“rest\\u cannot\\u create”。。。

有小费吗?

非常感谢。

2 个回复
最合适的回答,由SO网友:jDelforge 整理而成

这不是最安全的方法,但该插件至今仍在运行:

Basic Authentication handler

安装后,使用Javascript,我们只需使用Base64 variable :

var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\\+\\/\\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\\r\\n/g,"\\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};

... 和add in the beforeSend function :

xhr.setRequestHeader( \'Authorization\', \'Basic \' + Base64.encode( \'YOUR_USER_NAME\' + \':\' + \'YOUR_PASSWORD\' ); );

答对 了

SO网友:bosco

如您链接的文档页面所述,

请务必记住,此身份验证方法依赖于WordPress Cookie。因此,此方法仅适用于在WordPress内部使用REST API且当前用户已登录的情况。此外,当前用户必须具有执行正在执行的操作的适当能力。

您的JavaScript函数正在尝试更新影响站点数据库的post-an交互。因此,REST API需要身份验证才能执行该操作。而REST身份验证行为可以使用rest_authentication_errors 过滤器,它是highly 对于默认情况下需要身份验证的请求,禁用身份验证是不明智的,因为这样做会使您的站点在任何人的突发奇想下都会被修改。

您可能希望研究其他身份验证方法,如in the documentation page 您已链接。

相关推荐

JqueryUi对话框给出未捕获的TypeError:This._addClass不是函数错误

我有一个网站,我们需要一些自定义php编码来连接到外部数据库,以获取几个销售我们产品的供应商的产品评论URL。我们试图实现的基本想法是让用户注册他们的产品,然后如果他们愿意留下评论,就延长保修期。我正在使用XYZScript。com的“插入PHP”插件来实现这一点。该主题最初只加载了jQuery,以避免创建子主题,我们正在php脚本中加载jQueryUI。因此,我们将jQuery加载到文档的标题中,将jQueryUI加载到文档的正文中。我不太确定这是因为加载脚本的顺序造成的,还是其他一些冲突的javasc