Există o modalitate de a activa Cross-Origin Resource Sharing pentru ajaxurl în WordPress?

18 aug. 2015, 14:30:24
Vizualizări: 51.9K
Voturi: 10

WordPress are deja un URL implicit pentru apelurile jQuery-WordPress, cunoscut sub numele de ajaxurl. Cu toate acestea, există cazuri în care este necesară activarea Cross-Origin Resource Sharing (CORS) pentru ca orice hostname să poată avea acces la acesta.

Soluția mea actuală este adăugarea unei linii în /wp-includes/http.php cu:

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

Astfel încât va arăta:

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

Funcționează, dar editarea nucleului WordPress nu este o soluție bună.

Există o modalitate mai bună de a activa CORS pentru ajaxurl?

Avertisment

Acest subiect conține vulnerabilități de securitate atunci când este implementat efectiv într-o instalare WordPress.

Notă

Această întrebare a fost postată în perioada WordPress 4.3. Când a fost lansată versiunea WordPress 4.4 cu noua funcționalitate WordPress REST API, activarea CORS nu mai este necesară, în schimb se poate folosi hook-ul rest_api_init pentru adăugarea de endpoint-uri REST personalizate.

5
Comentarii

Vrei să apelezi un API, nu?? Gen JSON?

Sundar Sundar
18 aug. 2015 14:31:34

@solai Va fi folosit pentru a obține valoarea de răspuns de la o action specificată conform AJAX în Plugin-uri WordPress

Abel Melquiades Callejo Abel Melquiades Callejo
18 aug. 2015 14:33:56

OH... Deci vrei să trimiți o cerere către un alt domeniu. Vrei să apelezi acest URL xxx.com/ajax.php de pe yyy.com? Corect?

Sundar Sundar
18 aug. 2015 14:46:10

Așa este @solai

Abel Melquiades Callejo Abel Melquiades Callejo
18 aug. 2015 14:52:34

Dacă te uiți la sursă, atât get_http_origin cât și is_allowed_http_origin au filtre care îți permit să manipulezi valorile lor.

Milo Milo
18 aug. 2015 17:56:01
Toate răspunsurile la întrebare 4
0
18

Milo are dreptate.

De exemplu, accesează fișierul functions.php al temei tale și adaugă următorul cod:

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

Acum un apel AJAX de la https://site1.example.com către URL-ul AJAX al site-ului tău va avea în răspuns header-ul Access-Control-Allow-Origin corespunzător. De exemplu:

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

Doar adaugă acest cod în fișierul tău functions.php, nu este nevoie să actualizezi .htaccess, /wp-includes/http.php sau orice alt fișier de bază.

function just_add_cors_http_header($headers){

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

    return $headers;

}

add_filter('wp_headers','just_add_cors_http_header');

Noroc!

31 mar. 2020 22:43:32
0

Puteți realiza acest lucru folosind următorul cod.

Deschideți fișierul header.php

Găsiți următorul text în acel fișier

< !DOCTYPE html>

și înlocuiți-l cu următoarele:

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

Acum veți găsi Access-Control-Allow-Origin: * în header.

Sper că vă ajută..! Noroc.

18 aug. 2015 16:39:59
0

Cel mai bun mod pe care l-am găsit, am urmat acest link.

Doar adaugă codul sursă în fișierul WordPress header.php sau în fișierul ajax functions/api.

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

Mulțumesc

13 nov. 2019 10:29:18