Как включить Cross-Origin Resource Sharing для ajaxurl в WordPress?

18 авг. 2015 г., 14:30:24
Просмотры: 51.9K
Голосов: 10

WordPress уже имеет стандартный URL для вызовов jQuery-WordPress, известный как ajaxurl. Однако бывают случаи, когда необходимо включить Cross-Origin Resource Sharing (CORS), чтобы любой хост мог получить к нему доступ.

Мое текущее решение заключается в добавлении строки в /wp-includes/http.php:

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

Так что получается:

http.php

...
function send_origin_headers() {
    $origin = get_http_origin();

    @header( 'Access-Control-Allow-Origin: *' );
    if ( is_allowed_http_origin( $origin ) ) {
        @header( 'Access-Control-Allow-Origin: ' .  $origin );
        @header( 'Access-Control-Allow-Credentials: true' );
        if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] )
            exit;
        return $origin;
    }

    if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
        status_header( 403 );
        exit;
    }

    return false;
}
...

Это работает, но редактирование ядра WordPress - не лучшее решение.

Есть ли лучший способ включить CORS для ajaxurl?

Предупреждение

Эта тема содержит уязвимости безопасности при фактической реализации в установке WordPress.

Примечание

Этот вопрос был задан во времена WordPress 4.3. Когда вышел WordPress 4.4 с новой функцией WordPress REST API, необходимость в включении CORS отпала, и вместо этого стало возможным использовать хук rest_api_init для добавления пользовательских конечных точек REST.

5
Комментарии

Вы хотите вызвать API, верно? Что-то вроде JSON?

Sundar Sundar
18 авг. 2015 г. 14:31:34

@solai Это будет использоваться для получения значения ответа от указанного action в соответствии с AJAX в WordPress плагинах

Abel Melquiades Callejo Abel Melquiades Callejo
18 авг. 2015 г. 14:33:56

О.. То есть, вы хотите отправить запрос на другой домен. Вы хотите вызвать этот URL xxx.com/ajax.php с yyy.com? Правильно?

Sundar Sundar
18 авг. 2015 г. 14:46:10

Верно, @solai

Abel Melquiades Callejo Abel Melquiades Callejo
18 авг. 2015 г. 14:52:34

Если посмотреть исходный код, обе функции get_http_origin и is_allowed_http_origin имеют фильтры, позволяющие изменять их значения.

Milo Milo
18 авг. 2015 г. 17:56:01
Все ответы на вопрос 4
0
18

Майло прав.

Например, перейдите в файл functions.php вашей темы и добавьте следующий код:

add_filter( 'allowed_http_origins', 'add_allowed_origins' );
function add_allowed_origins( $origins ) {
    $origins[] = 'https://site1.example.com';
    $origins[] = 'https://site2.example.com';
    return $origins;
}

Теперь AJAX-запрос с https://site1.example.com к URL AJAX вашего сайта будет содержать соответствующий заголовок Access-Control-Allow-Origin в ответе. Например:

$.ajax({
    url: 'https://site1.example.com/wp-admin/admin-ajax.php',
    type: "POST",
    data: {
        ...
    },
    success: function(doc) {
        ...
    }
});
13 мая 2016 г. 11:12:05
0

Просто добавьте этот код в ваш файл function.php, не нужно обновлять .htaccess, /wp-includes/http.php или любые другие системные файлы.

function just_add_cors_http_header($headers){

    // Разрешаем доступ с любого домена
    $headers['Access-Control-Allow-Origin'] = '*';

    return $headers;

}

// Добавляем наш фильтр к заголовкам WordPress
add_filter('wp_headers','just_add_cors_http_header');

Удачи!

31 мар. 2020 г. 22:43:32
0

Вы можете добиться этого с помощью следующего кода.

Откройте ваш файл header.php

найдите в этом файле следующий текст

<!DOCTYPE html>

и замените его на следующий код.

<?php /** @package WordPress @subpackage Default_Theme  **/
header("Access-Control-Allow-Origin: *"); 
?>
<!DOCTYPE html>
...

Теперь вы увидите Access-Control-Allow-Origin: * в ваших заголовках.

Надеюсь, это поможет..! Удачи.

18 авг. 2015 г. 16:39:59
0

Лучший способ, который я нашел, следовал по этой ссылке.

Просто добавьте исходный код в файл header.php WordPress или в файл ajax functions/api.

Ссылка: [https://stackoverflow.com/a/25719261/5431206]

Спасибо

13 нояб. 2019 г. 10:29:18