Ajax nu funcționează corect în Firefox, dar merge în Chrome - Soluții și Debugging
Lucrez la un plugin care funcționează corect în Chrome, dar nu lansează scriptul PHP via Ajax în Firefox. Această problemă mă disperă. Iată blocurile de cod relevante.
În primul rând, încărcarea 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' );
// declară URL-ul către fișierul care gestionează cererea 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 ()
)
);
Acum, JavaScript-ul care face apelul 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");
Array-ul de date constă din:
var data = {
action: 'dgx_donate_paypalstd_ajax_checkout',
referringUrl: referringUrl,
nonce: nonce,
sessionID: sessionID,
donationAmount: donationAmount,
(și așa mai departe, este un array mare)
};
Hook-urile:
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' );
Și, în final, începutul funcției 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 () );
În Chrome, fișierul de log arată clar că funcția a fost apelată, dar în Firefox nu apare nimic. De asemenea, în Chrome, consola browserului afișează intrările înainte și după apelurile jQuery.ajax, precum și mesajul "success", dar Firefox nu face acest lucru.
Pot confirma că variabila pentru URL-ul Ajax este transmisă, deoarece acest mesaj:
"-- SeamlessDonationsCheckout: ajaxurl=http://podtrack.com/wp-admin/admin-ajax.php"
apare în consola browserului Firefox. Deci nu este vorba că URL-ul Ajax nu este transmis.
Aș aprecia orice îndrumare. Această problemă m-a blocat complet.
Mulțumesc!
--David

Acesta este scheletul de bază pentru un apel și răspuns AJAX. Verifică și asigură-te că funcționează în Chrome și Firefox pentru tine — pentru mine funcționează.
<?php
// O funcție pentru datele pe care le vom transmite
function dgx_donate_get_countries_requiring_postal_code()
{
return "cc cod poștal chestii...";
}
// Înregistrăm totul
add_action('init', function () {
// Adăugăm scripturile necesare
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');
// Localizăm datele noastre
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()
)
);
// Înregistrăm gestionarii 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');
// Gestionarul AJAX (PRIV / NO PRIV)
function dgx_donate_paypalstd_ajax_checkout()
{
// Dacă eșuăm, nu fi tăcut
$fail_message = '';
if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Nonce incorect';
if (empty ($_POST['action'])) $fail_message = 'Acțiune lipsă';
if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Acțiune incorectă';
// Am eșuat, să le spunem...
if (!empty ($fail_message)) {
wp_send_json_error(array(
'message' => $fail_message
)); // die
}
// Facem logica necesară
// Trimitem Răspunsul de Succes
wp_send_json_success(array(
'action' => $_POST['action'],
'message' => 'Finalizare cu succes',
'postalCodeRequired' => $_POST['postalCodeRequired'],
'ID' => 1
)); // die
}
});
// Scurtătură pentru a declanșa apelul AJAX la încărcarea paginii
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) {
// uită-te la răspuns
if (response.success) {
// date de succes
console.log(response.data);
} else {
// nu e bine
console.log(response);
}
}
});
})(jQuery);
</script>
<?php });

Ai nevoie de
type: 'POST'
în apelul tău jQuery.ajax. Valoarea implicită este GET, iar acest lucru necesită POST.
Deoarece cineva a cerut un exemplu mai jos:
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
type: 'POST',
success: function() {
console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
//response(data);
}
});

Cred că response
trebuie să fie și el în argumentele funcției?? success: function(response) {
