Ajax non funziona correttamente in Firefox ma funziona in Chrome
Sto lavorando a un plugin che sembra funzionare bene in Chrome, ma non riesce a eseguire lo script PHP via Ajax in Firefox. Mi sta facendo impazzire. Ecco i blocchi di codice relativi al problema.
Innanzitutto, l'enqueue dello JavaScript:
wp_enqueue_script ( 'jquery' );
$script_url = plugins_url ( '/js/seamless-donations.js', __FILE__ );
wp_register_script ( 'seamless_javascript_code', $script_url, array( 'jquery' ), false );
wp_enqueue_script ( 'seamless_javascript_code' );
// dichiara l'URL del file che gestisce la richiesta AJAX (wp-admin/admin-ajax.php)
wp_localize_script (
'seamless_javascript_code', 'dgxDonateAjax',
array(
'ajaxurl' => admin_url ( 'admin-ajax.php' ),
'nonce' => wp_create_nonce ( 'dgx-donate-nonce' ),
'postalCodeRequired' => dgx_donate_get_countries_requiring_postal_code ()
)
);
Ora, il JavaScript correlato che effettua la chiamata Ajax:
console.log("-- SeamlessDonationsCheckout: before jQuery.post");
console.log("-- SeamlessDonationsCheckout: ajaxurl=" + dgxDonateAjax.ajaxurl);
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
success: function() {
console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
//response(data);
}
});
//jQuery.post(dgxDonateAjax.ajaxurl, data, SeamlessDonationsAjaxCallback);
console.log("-- SeamlessDonationsCheckout: after jQuery.post");
L'array data contiene:
var data = {
action: 'dgx_donate_paypalstd_ajax_checkout',
referringUrl: referringUrl,
nonce: nonce,
sessionID: sessionID,
donationAmount: donationAmount,
(e così via, è un array grande)
};
Gli hook:
add_action ( 'wp_ajax_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout' );
add_action ( 'wp_ajax_nopriv_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout' );
E, infine, l'inizio della funzione PHP Ajax:
function dgx_donate_paypalstd_ajax_checkout () {
// Log
dgx_donate_debug_log ( '----------------------------------------' );
dgx_donate_debug_log ( 'DONATION TRANSACTION STARTED' );
$php_version = phpversion ();
dgx_donate_debug_log ( "PHP Version: $php_version" );
dgx_donate_debug_log ( "Seamless Donations Version: " . dgx_donate_get_version () );
In Chrome, il file di log mostra chiaramente che la funzione è stata chiamata, ma in Firefox non c'è nulla. Inoltre, in Chrome, il log del browser mostra le voci prima e dopo le chiamate jQuery.ajax, così come la voce "success", ma Firefox no.
Posso confermare che la variabile per l'URL Ajax viene passata, perché questo messaggio
"-- SeamlessDonationsCheckout: ajaxurl=http://podtrack.com/wp-admin/admin-ajax.php"
appare nella console del browser Firefox. Quindi non è che l'URL Ajax non venga passato.
Apprezzerei molto qualsiasi indicazione. Questo problema mi ha davvero bloccato.
Grazie!
--David

Questo è lo scheletro di base per una chiamata e risposta AJAX. Controlla e assicurati che funzioni su Chrome e Firefox per te — per me funziona.
<?php
// Funzione per i dati che passeremo
function dgx_donate_get_countries_requiring_postal_code()
{
return "cc postal code stuff...";
}
// Registra tutto
add_action('init', function () {
// Aggiungi gli script necessari
wp_enqueue_script('jquery');
$script_url = plugins_url('/js/seamless-donations.js', __FILE__);
wp_register_script('seamless_javascript_code', $script_url, array('jquery'), false);
wp_enqueue_script('seamless_javascript_code');
// Localizza i nostri dati
wp_localize_script(
'seamless_javascript_code', 'dgxDonateAjax',
array(
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('dgx-donate-nonce'),
'postalCodeRequired' => dgx_donate_get_countries_requiring_postal_code()
)
);
// Registra i gestori AJAX
add_action('wp_ajax_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout');
add_action('wp_ajax_nopriv_dgx_donate_paypalstd_ajax_checkout', 'dgx_donate_paypalstd_ajax_checkout');
// Gestore AJAX (PRIV / NO PRIV)
function dgx_donate_paypalstd_ajax_checkout()
{
// Se falliamo, non essere silenzioso
$fail_message = '';
if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Nonce non valido';
if (empty ($_POST['action'])) $fail_message = 'Azione mancante';
if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Azione non valida';
// Abbiamo fallito, facciamoglielo sapere...
if (!empty ($fail_message)) {
wp_send_json_error(array(
'message' => $fail_message
)); // die
}
// Esegui la logica
// Invia la risposta di successo
wp_send_json_success(array(
'action' => $_POST['action'],
'message' => 'Checkout completato',
'postalCodeRequired' => $_POST['postalCodeRequired'],
'ID' => 1
)); // die
}
});
// Scorciatoia per attivare la chiamata AJAX al caricamento della pagina
add_action('wp_footer', function () { ?>
<script>
(function ($) {
var data = {
action: 'dgx_donate_paypalstd_ajax_checkout',
nonce: dgxDonateAjax.nonce,
postalCodeRequired: dgxDonateAjax.postalCodeRequired,
};
$.ajax({
type: 'POST',
url: dgxDonateAjax.ajaxurl,
data: data,
success: function (response) {
// osserva la risposta
if (response.success) {
// dati di successo
console.log(response.data);
} else {
// non va bene
console.log(response);
}
}
});
})(jQuery);
</script>
<?php });

È necessario
type: 'POST'
nella tua chiamata jQuery.ajax. L'impostazione predefinita è GET, mentre questa richiede POST.
Poiché qualcuno ha richiesto un esempio:
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
type: 'POST',
success: function() {
console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
//response(data);
}
});

Penso che response
debba essere anche negli argomenti della funzione?? success: function(response) {
