WP REST API是一个json插件,这个插件非常强大,可以通过javascript或者其他编程语言跨域访问WordPress的相关信息。但是当我使用时却发现不论怎么使用都是出现No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
1、小日本给出的解决方法就是在模板文件中的function.php中添加以下代码(以下代码的意思就是为WordPress头部添加一个Access-Control-Allow-Origin)
function add_allow_header( $headers ) {
if ( ! is_admin() ) {
$headers['Access-Control-Allow-Origin'] = 'http://localhost';//请将此域名修改成你自己允许跨域访问的域名,或者直接将域名改为*,*代表所有域名都可以直接跨域访问。
$headers['Access-Control-Allow-Credentials'] = 'true';
return $headers;
}
}
add_filter( 'wp_headers', 'add_allow_header' );
不过我尝试了,没有通过。依然无望中。
2、WP开发者网站上也有人提过这个问题,当然给出的解决方法和小日本的方法差不多
当然这个的做法也是没有用的。
3、我一再搜索,终于搜索到了另一个解决办法,尝试了,但是也是失败了。这位老外给出的解决方法如下:
找到json-rest-api/lib/class-wp-json-posts.php大概190行左右的代码
$response->header( 'Last-Modified', mysql2date( 'D, d M Y H:i:s', $post['post_modified_gmt'] ) . 'GMT' );
在此代码下面输入
$response->header('Access-Control-Allow-Credentials:*')
当然这样的解决方法也是不正确,也是无用功的!
4、最终解决方法
在无奈之下,自己只有去寻找更好的解决方法了,无奈之下将WP REST API的相关代码看了一遍,才发现原来在json-rest-api/plugin.php里面早就已经有了相应的代码,我们只需要对其进行修改即可。
我们查找function json_send_cors_headers( $value )
就可以看到如下代码:
function json_send_cors_headers( $value ) {
$origin = get_http_origin();
if ( $origin ) {
header( 'Access-Control-Allow-Origin: '+$origin);
header( 'Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE' );
header( 'Access-Control-Allow-Credentials: true' );
}
return $value;
}
我们将header( 'Access-Control-Allow-Origin: '+$origin);直接将这个代码修改为header( 'Access-Control-Allow-Origin: *');即可实现所有域名及时本地都可以跨域访问个人WordPress。