Ajax no se ejecuta correctamente en Firefox pero funciona en Chrome
Estoy trabajando en un plugin que parece funcionar bien en Chrome, pero no ejecuta el script PHP mediante Ajax en Firefox. Me está volviendo loco. Aquí están los bloques de código relacionados.
Primero, la cola de 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' );
// declarar la URL al archivo que maneja la solicitud 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 ()
)
);
Ahora, el JavaScript relacionado que hace la llamada Ajax:
console.log("-- SeamlessDonationsCheckout: antes de jQuery.post");
console.log("-- SeamlessDonationsCheckout: ajaxurl=" + dgxDonateAjax.ajaxurl);
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
success: function() {
console.log("-- SeamlessDonationsCheckout: éxito en jQuery.ajax");
//response(data);
}
});
//jQuery.post(dgxDonateAjax.ajaxurl, data, SeamlessDonationsAjaxCallback);
console.log("-- SeamlessDonationsCheckout: después de jQuery.post");
El array de datos consiste en:
var data = {
action: 'dgx_donate_paypalstd_ajax_checkout',
referringUrl: referringUrl,
nonce: nonce,
sessionID: sessionID,
donationAmount: donationAmount,
(y así sucesivamente, es un array grande)
};
Los hooks:
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' );
Y, finalmente, el comienzo de la función PHP Ajax:
function dgx_donate_paypalstd_ajax_checkout () {
// Registro
dgx_donate_debug_log ( '----------------------------------------' );
dgx_donate_debug_log ( 'INICIO DE TRANSACCIÓN DE DONACIÓN' );
$php_version = phpversion ();
dgx_donate_debug_log ( "Versión PHP: $php_version" );
dgx_donate_debug_log ( "Versión de Seamless Donations: " . dgx_donate_get_version () );
En Chrome, el archivo de registro muestra claramente que la función ha sido llamada, pero no hay nada en Firefox. Además, en Chrome, el registro del navegador muestra las entradas antes y después de las llamadas jQuery.ajax, así como la entrada de "éxito", pero Firefox no lo hace.
Puedo confirmar que la variable para la URL Ajax se pasa, porque este mensaje
"-- SeamlessDonationsCheckout: ajaxurl=http://podtrack.com/wp-admin/admin-ajax.php"
aparece en la consola del navegador Firefox. Así que no es que la URL ajax no se esté pasando.
Realmente agradecería cualquier orientación. Este problema me tiene muy perplejo.
¡Gracias!
--David

Este es el esqueleto básico para una llamada y respuesta AJAX. Échale un vistazo y asegúrate de que funcione en Chrome y Firefox para ti - a mí me funciona.
<?php
// Alguna función para los datos que pasaremos
function dgx_donate_get_countries_requiring_postal_code()
{
return "cc código postal cosas...";
}
// Registrar todo
add_action('init', function () {
// Añadir scripts requeridos
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');
// Localizar nuestros datos
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()
)
);
// Registrar manejadores 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');
// Manejador AJAX (PRIV / NO PRIV)
function dgx_donate_paypalstd_ajax_checkout()
{
// Si fallamos, no te quedes callado
$fail_message = '';
if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Nonce incorrecto';
if (empty ($_POST['action'])) $fail_message = 'Falta la acción';
if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Acción incorrecta';
// Fallamos, avisemos...
if (!empty ($fail_message)) {
wp_send_json_error(array(
'message' => $fail_message
)); // die
}
// Hacer lógica de cosas
// Enviar la respuesta de éxito
wp_send_json_success(array(
'action' => $_POST['action'],
'message' => 'Checkout completado',
'postalCodeRequired' => $_POST['postalCodeRequired'],
'ID' => 1
)); // die
}
});
// Atajo para activar la llamada AJAX al cargar la página
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) {
// mira la respuesta
if (response.success) {
// datos de éxito
console.log(response.data);
} else {
// no bien
console.log(response);
}
}
});
})(jQuery);
</script>
<?php });

Necesitas
type: 'POST'
en tu llamada jQuery.ajax. El valor por defecto es GET, y esto requiere POST.
Porque alguien más abajo solicitó un ejemplo:
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
type: 'POST',
success: function() {
console.log("-- SeamlessDonationsCheckout: éxito en jQuery.ajax");
//response(data);
}
});

Creo que response
también debe estar en los argumentos de la función?? success: function(response) {
