在JSON API Wordpress上启用CORS

Mar*_*lli 18 wordpress jquery json wordpress-plugin cors

我有一个带有一个名为JSON API的插件的wordpress网站.此插件为wordpress中的内容提供JSON格式.我能够通过添加标题("Access-Control-Allow-Origin:*")在wordpress上启用CORS; 在php标题上.但是当我尝试使用JSON API插件提供的URL时,CORS不再起作用了.

这是wordpress网站,我正在做测试...我使用测试cors网站检查它是否正常工作,它是... http://kiwa-app.loading.net/

但是,当我尝试使用JSON api提供给我的URL时,不再工作了.我仍然有错误No'Access-Control-Allow-Origin'http: //kiwa-app.loading.net/?json=info

我会感谢一些帮助!

she*_*rek 26

我使用了一些不同的WordPress API - 但是对于那些使用'官方' WP-API的人来说,我在使用这个CORS时遇到了很多麻烦 - 我发现的是.htaccess方法和其他一些方法之间我偶然发现...将此添加到您的主题functions.php工作得最好.

function add_cors_http_header(){
    header("Access-Control-Allow-Origin: *");
}
add_action('init','add_cors_http_header');
Run Code Online (Sandbox Code Playgroud)

一定不要使用这些组合(.htaccess,header.php,api.php,functions.php),因为它会对你生气.


Mar*_*lli 14

好的,我终于找到了一个简单的方法......

你只需要添加:

     <? header("Access-Control-Allow-Origin: *"); ?>
Run Code Online (Sandbox Code Playgroud)

在文件api.php上,此文件位于wp-content/plugins/json-api/singletons/api.php

我希望它可以帮助更多人解决同样的问题!

  • 不应该编辑核心文件,使用过滤器更好. (4认同)
  • 对于像我这样困惑的人,将它添加为 `&lt;?php` 之前的第一行,没有空行。 (2认同)
  • 每次 WordPress 更新时都会删除此行更改,被否决。 (2认同)
  • 正如@IvanCastellanos所说,这确实是肮脏的修复程序,当WordPress更新时,该修复程序将丢失 (2认同)

bra*_*ilo 9

在将响应发送到浏览器之前,我们可以运行两个操作挂钩并插入一个新的header():

do_action("json_api", $controller, $method);
do_action("json_api-{$controller}-$method");
Run Code Online (Sandbox Code Playgroud)

第一个运行在每个方法上,第二个是针对特定方法.这是第一个的实现,用注释的方式找到第二个:

add_action( 'json_api', function( $controller, $method )
{
    # DEBUG
    // wp_die( "To target only this method use <pre><code>add_action('$controller-$method', function(){ /*YOUR-STUFF*/ });</code></pre>" );

    header( "Access-Control-Allow-Origin: *" );
}, 10, 2 );
Run Code Online (Sandbox Code Playgroud)


Gra*_*ant 7

使用 Wordpress 5.2.3 - 在外部使用 GET 和 POST 时,以下最终为我打开了芝麻。在找到适用于我的案例的解决方案之前,我尝试了上述所有答案(无济于事)。

add_action( 'rest_api_init', function () {
    add_action( 'rest_pre_serve_request', function () {
        header( 'Access-Control-Allow-Headers: Authorization, Content-Type, X-WP-Wpml-Language', true );
        header("Access-Control-Allow-Origin: *");
    } );
}, 15 );
Run Code Online (Sandbox Code Playgroud)

希望 WordPress 将来会有一个官方的小狗门襟用于 CORS 控制。


Sud*_*dar 6

现在 REST API 已与核心合并,我们可以使用该rest_api_init操作。

add_action( 'rest_api_init', function()
{
    header( "Access-Control-Allow-Origin: *" );
} );
Run Code Online (Sandbox Code Playgroud)


Lan*_*and 6

WordPress 5(实际上是 4.4+)可以通过 WP Headers 处理它:

尝试这个:

add_filter( 'wp_headers', 'send_cors_headers', 11, 1 );
function send_cors_headers( $headers ) {
    $headers['Access-Control-Allow-Origin'] = $_SERVER[ 'HTTP_ORIGIN' ];
    return $headers;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这将允许从任何来源进行访问。为了安全起见,您应该尝试执行一些操作,例如设置允许的域数组,这些域可以向您的 WordPress 站点发出请求,并在发出请求的域不在允许列表中时短路允许 CORS:

add_filter( 'wp_headers', 'send_cors_headers', 11, 1 );
function send_cors_headers( $headers ) {
    $allowed_domains = array( 'https://my.okdomain.com' , 'http://anothergoodone.com');
    if ( ! in_array( $_SERVER[ 'HTTP_ORIGIN' ] , $allowed_domains ) ) return $headers;
    $headers['Access-Control-Allow-Origin'] = $_SERVER[ 'HTTP_ORIGIN' ];
    return $headers;
}
Run Code Online (Sandbox Code Playgroud)