Включить 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;
});