¿Hay alguna forma de habilitar el intercambio de recursos de origen cruzado (CORS) para el ajaxurl de WordPress?
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.

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

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!

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.

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
