Включить CORS на JSON API Wordpress

У меня есть сайт wordpress с плагином JSON API. Этот плагин предоставляет формат JSON для контента, который находится в Wordpress. Я смог включить CORS в wordpress, добавив заголовок ( "Access-Control-Allow-Origin: *" ); на заголовке php. Но когда я попробовал URL-адрес, который плагин JSON API предоставляет CORS, он больше не работает.

Это сайт wordpress, я делаю тесты... Я использовал веб-сайт test cors, чтобы проверить, работает ли он, и это... http://kiwa-app.loading.net/

Но когда я пытаюсь использовать URL-адрес, который предоставляет мне JSON api, больше не работает. У меня все еще есть ошибка No 'Access-Control-Allow-Origin' http://kiwa-app.loading.net/?json=info

Я благодарю вас за помощь!

Ответ 1

Хорошо, я наконец-то выяснил простой способ...

Вам просто нужно добавить:

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

В файле api.php этот файл находится в wp-content/plugins/json-api/singletons/api.php

Я надеюсь, что это поможет большему количеству людей с той же проблемой!

Ответ 2

Я использовал несколько разных 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), поскольку они будут сердиться на вас.

Ответ 3

Прежде чем ответ будет отправлен в браузер, мы сможем запустить два крючка для действий и вставить новый 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 );

Ответ 4

В плагинах wordpress goto > JSON API > Изменить

В правом выборе файла выберите

JSON-API/синглтоны/api.php

Вам нужно будет добавить следующую строку

( "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() {

Ответ 5

Для тех, кто имеет эту проблему с несколькими источниками

На сервере, на котором размещен ваш сайт 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: *' );

Надеюсь, это поможет любому, кто сталкивался с теми же проблемами, что и я.

Ответ 6

В проекте WordPress перейдите к следующему файлу и сделайте так

В we-includes/rest-api.php изменить header( 'Access-Control-Allow-Origin: '. $origin ); в header( 'Access-Control-Allow-Origin: *'); ,
В we-includes/http.php изменить header( 'Access-Control-Allow-Origin: '. $origin ); в header( 'Access-Control-Allow-Origin: *'); ,

Ответ 7

Теперь, когда REST API объединен с ядром, мы можем использовать действие rest_api_init.

add_action( 'rest_api_init', function()
{
    header( "Access-Control-Allow-Origin: *" );
} );

Ответ 8

WordPress 5 (на самом деле 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;
}

Ответ 9

Решение работает с WordPress 5.1.1 и Gutenberg

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