¿Hay alguna forma de habilitar el intercambio de recursos de origen cruzado (CORS) para el ajaxurl de WordPress?

18 ago 2015, 14:30:24
Vistas: 51.9K
Votos: 10

WordPress ya tiene una URL predeterminada para las llamadas de aplicaciones jQuery-WordPress y es conocida como ajaxurl. Sin embargo, hay casos en los que uno necesita habilitar el Intercambio de Recursos de Origen Cruzado (CORS) para permitir que cualquier nombre de host pueda acceder a ella.

Mi solución actual es agregar una línea en /wp-includes/http.php con:

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

De manera que quedará:

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;
}
...

Funciona pero editar el núcleo de WordPress no es una buena solución.

¿Hay una mejor manera de habilitar CORS para el ajaxurl?

Advertencia

Este tema contiene vulnerabilidades de seguridad cuando se implementa realmente en una instalación de WordPress.

Nota

Esta pregunta fue publicada durante la era de WordPress 4.3. Cuando se lanzó WordPress 4.4 con la nueva característica WordPress REST API, habilitar CORS ya no fue necesario y en su lugar solo se usa el gancho rest_api_init para agregar endpoints REST personalizados.

5
Comentarios

¿Quieres llamar a una API, cierto? ¿Algo tipo JSON?

Sundar Sundar
18 ago 2015 14:31:34

@solai Se utilizará para obtener el valor de respuesta de una action específica según AJAX en Plugins de WordPress

Abel Melquiades Callejo Abel Melquiades Callejo
18 ago 2015 14:33:56

OH... Entonces, quieres enviar una solicitud a un dominio diferente. ¿Quieres llamar a esta URL xxx.com/ajax.php desde yyy.com? ¿Correcto?

Sundar Sundar
18 ago 2015 14:46:10

Así es @solai

Abel Melquiades Callejo Abel Melquiades Callejo
18 ago 2015 14:52:34

Si miras el código fuente, tanto get_http_origin como is_allowed_http_origin tienen filtros que te permiten manipular sus valores.

Milo Milo
18 ago 2015 17:56:01
Todas las respuestas a la pregunta 4
0
18

Milo tiene razón.

Por ejemplo, ve al archivo functions.php de tu tema y agrega lo siguiente:

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

Ahora una llamada ajax desde https://site1.example.com a la URL ajax de tu sitio tendrá el encabezado Access-Control-Allow-Origin apropiado en la respuesta. Ejemplo:

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

Solo añade este código en tu function.php, no es necesario actualizar .htaccess, /wp-includes/http.php o cualquier otro archivo principal.

function just_add_cors_http_header($headers){

    $headers['Access-Control-Allow-Origin'] = '*';

    return $headers;

}

add_filter('wp_headers','just_add_cors_http_header');

¡Saludos!

31 mar 2020 22:43:32
0

Puedes lograrlo con el siguiente código.

Abre tu archivo header.php

Busca el siguiente texto en ese archivo

<!DOCTYPE html>

y reemplázalo con lo siguiente:

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

Ahora podrás ver Access-Control-Allow-Origin: * en tu encabezado.

¡Espero que esto ayude! Saludos.

18 ago 2015 16:39:59
0

La mejor manera que encontré fue siguiendo este enlace.

Solo agrega el código de origen al archivo header.php de WordPress o al archivo de funciones/api para AJAX.

Enlace: [https://stackoverflow.com/a/25719261/5431206]

Gracias

13 nov 2019 10:29:18