在 JSON API Wordpress 上启用 CORS

Posted

技术标签:

【中文标题】在 JSON API Wordpress 上启用 CORS【英文标题】:Enable CORS on JSON API Wordpress 【发布时间】:2014-10-31 08:41:59 【问题描述】:

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

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

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

我会得到一些帮助谢谢!!!

【问题讨论】:

【参考方案1】:

我使用了一些不同的 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');

确保不要使用这些(.htaccess、header.php、api.php、functions.php)的任何组合,因为它会生你的气。

【讨论】:

这适用于 v1,但我又遇到了这个问题 - 我对 v2 还没有任何运气。 适用于 Wordpress API V2。我能找到的最佳解决方案。 这是唯一适合我的解决方案。某些服务器不允许您在 htacces 中设置 CORS 这对我有用!测试并确保其正常工作的一个好方法是检查标头 — Advanced Rest Client 是一个很好的工具。 这在 Wordpress V5 中对我不起作用,我检查了标题但我的标题不在其中。【参考方案2】:

好吧,我终于想出了一个简单的方法......

你只需要添加:

     <? header("Access-Control-Allow-Origin: *"); ?>

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

希望能帮助更多有同样问题的人!

【讨论】:

对于像我这样困惑的任何人,请将其添加为 &lt;?php 之前的第一行,不要有空行。 不应该编辑核心文件,使用过滤器更好。 每次 wordpress 更新、否决时都会删除此行更改。 正如@IvanCastellanos 所说,这是一个非常肮脏的修复,当 WordPress 更新时会丢失 wp-content/plugins/json-api/singletons/api.php 在我的中找不到。在/wp-includes/rest-api 中找到了与 rest api 相关的内容,但如果需要更改,请查看 idk。【参考方案3】:

在响应发送到浏览器之前,我们可以运行two action hooks并插入一个新的header()

do_action("json_api", $controller, $method);
do_action("json_api-$controller-$method");

第一个在每个方法上运行,第二个是针对特定方法。这是第一个的实现,带有注释的方法可以找到第二个:

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 );

【讨论】:

json-rest-api 插件的动作有:json_insert_post, json_insert_user, json_query_navigation_headers, wp_json_server_before_serve【参考方案4】:

使用 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 );

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

【讨论】:

你在哪里添加了这个文件。 @ChinomsoJohnson functions.php 在您的主题文件夹中【参考方案5】:

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

add_action( 'rest_api_init', function()

    header( "Access-Control-Allow-Origin: *" );
 );

【讨论】:

我应该将它添加到哪个文件中? @HaseebBurki 上面的代码扩展了一个动作。您可以将此代码添加到主题的 functions.php 文件中,也可以添加到新的自定义插件中。【参考方案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;

请注意,这将允许从任何来源进行访问。为了安全起见,您应该尝试设置一组允许的域,这些域可以向您的 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;

【讨论】:

有没有人知道把这段代码放在哪里?【参考方案7】:

在 wordpress 中转到插件 > JSON API > 编辑

从右侧文件选择中选择

json-api/singletons/api.php

您需要添加以下行

header("Access-Control-Allow-Origin: *");

完成后,您的代码应该与此类似。 在其他任何地方添加此行可能无法按预期工作。

<?php
header("Access-Control-Allow-Origin: *"); 
class JSON_API 

  function __construct() 
    $this->query = new JSON_API_Query();
    $this->introspector = new JSON_API_Introspector();
    $this->response = new JSON_API_Response();
    add_action('template_redirect', array(&$this, 'template_redirect'));
    add_action('admin_menu', array(&$this, 'admin_menu'));
    add_action('update_option_json_api_base', array(&$this, 'flush_rewrite_rules'));
    add_action('pre_update_option_json_api_controllers', array(&$this, 'update_controllers'));
  

  function template_redirect() 

【讨论】:

如果没有安装json api怎么办?【参考方案8】:

如果有人在尝试所有上述代码(在您的主题中更改 funtions.php)/.htaccess 方式后仍然遇到任何问题,那么这个问题可能与您的托管服务提供商有关。

我已经尝试了所有可能的方法,并在这个问题上浪费了两天时间,才知道问题是由于infinityfree . com(免费托管服务提供商)造成的。

参考: https://wordpress.org/support/topic/wordpress-api-blocks-post-by-cors-policy/ https://wordpress.org/support/topic/wordpress-api-blocks-post-by-cors-policy-2/

【讨论】:

【参考方案9】:

对于遇到多个来源

这个问题的任何人

在托管您的 wordpress 网站的服务器中,导航到 ../wp-content/plugins/json-rest-api 并从此处打开 plugin.php 文件。

在这个函数中

function json_send_cors_headers( $value ) ..

更改标题

header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) );

header( 'Access-Control-Allow-Origin: *' );

希望这对遇到与我相同问题的人有所帮助。

【讨论】:

【参考方案10】:

该解决方案适用于 WordPress 5.1.1 和 Gutenberg

add_filter('rest_url', function($url) 
    $url = str_replace(home_url(), site_url(), $url);
    return $url;
);

【讨论】:

【参考方案11】:

在 WordPress 项目中转到以下文件并执行以下操作:

wp-includes/rest-api.php更改:

header( 'Access-Control-Allow-Origin: ' . $origin );

到:

header( 'Access-Control-Allow-Origin: *' );

wp-includes/http.php更改:

header( 'Access-Control-Allow-Origin: ' . $origin );

到:

header( 'Access-Control-Allow-Origin: *' );

【讨论】:

您不想更改wp-includes 文件夹,因为如果您更新它可能会被删除。 永远不要更改 wp 核心文件。任何人在看这个问题,不要使用这个答案,这很危险。

以上是关于在 JSON API Wordpress 上启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

启用 CORS 从 Cordova 应用程序调用 JSON REST

如何让 Wordpress JSON-API 在 Nginx 服务器上工作?

WordPress acf-to-rest-api && Rest API

在 wordpress api 中启用 CORS

Sencha Touch 和 WordPress BuddyPress API 之间的 JSON 解析问题

Wordpress Rest Api 帖子获取