Esiste un modo per abilitare il Cross-Origin Resource Sharing per l'ajaxurl di WordPress?
WordPress ha già un URL predefinito per le chiamate jQuery-WordPress noto come ajaxurl
. Tuttavia, ci sono casi in cui è necessario abilitare il Cross-Origin Resource Sharing (CORS) su di esso in modo che qualsiasi hostname possa accedervi.
La mia soluzione attuale è aggiungere una riga in /wp-includes/http.php
con:
@header( 'Access-Control-Allow-Origin: *' );
In modo che diventi:
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;
}
...
Funziona ma modificare il core di WordPress non è una buona soluzione.
Esiste un modo migliore per abilitare il CORS per ajaxurl
?
Avvertenza
Questo argomento contiene vulnerabilità di sicurezza quando viene effettivamente implementato su un'installazione WordPress.
Nota
Questa domanda è stata pubblicata durante l'era di WordPress 4.3. Quando è stato rilasciato WordPress 4.4 con la nuova funzionalità WordPress REST API, l'abilitazione del CORS non è più diventata necessaria e invece è sufficiente utilizzare l'hook rest_api_init
per aggiungere endpoint REST personalizzati.

Milo ha ragione.
Ad esempio, vai nel file functions.php del tuo tema e aggiungi il seguente codice:
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;
}
Ora una chiamata ajax da https://site1.example.com all'URL ajax del tuo sito avrà l'appropriato header Access-Control-Allow-Origin nella risposta. Esempio:
$.ajax({
url: 'https://site1.example.com/wp-admin/admin-ajax.php',
type: "POST",
data: {
...
},
success: function(doc) {
...
}
});

Basta aggiungere questo codice nel tuo functions.php, non è necessario aggiornare .htaccess
, /wp-includes/http.php
o qualsiasi altro file core.
function just_add_cors_http_header($headers){
$headers['Access-Control-Allow-Origin'] = '*';
return $headers;
}
add_filter('wp_headers','just_add_cors_http_header');
Saluti!

Puoi ottenerlo con il seguente codice.
Apri il tuo file header.php
cerca il seguente testo nel file
<!DOCTYPE html>
e sostituiscilo con quanto segue.
<?php /** @package WordPress @subpackage Default_Theme **/
header("Access-Control-Allow-Origin: *");
?>
<!DOCTYPE html>
...
Ora potrai vedere Access-Control-Allow-Origin: * nel tuo header.
Spero sia utile..! Saluti.

Il modo migliore che ho trovato è seguire questo link.
Basta aggiungere il codice originale al file header.php di WordPress oppure al file functions/api per AJAX.
Link: [https://stackoverflow.com/a/25719261/5431206]
Grazie
