WordPress WP REST API 插件开启 Access-Control-Allow-Origin

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开发者网站上也有人提过这个问题,当然给出的解决方法和小日本的方法差不多

<?php
add_filter( 'wp_headers', array( 'eg_send_cors_headers' ), 11, 1 );
function eg_send_cors_headers( $headers ) {
        $headers['Access-Control-Allow-Origin']      = get_http_origin(); // Can't use wildcard origin for credentials requests, instead set it to the requesting origin
        $headers['Access-Control-Allow-Credentials'] = 'true';
        // Access-Control headers are received during OPTIONS requests
        if ( 'OPTIONS' == $_SERVER['REQUEST_METHOD'] ) {
            if ( isset( $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] ) ) {
                $headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS';
            }
            if ( isset( $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'] ) ) {
                $headers['Access-Control-Allow-Headers'] = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'];
            }
        }
    return $headers;
}

当然这个的做法也是没有用的。
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。

发表评论

邮箱地址不会被公开。 必填项已用*标注