Ajax не работает корректно в Firefox, но работает в Chrome
Я работаю над плагином, который корректно работает в Chrome, но не запускает PHP скрипт через Ajax в Firefox. Это сводит меня с ума. Вот относящиеся к проблеме блоки кода.
Сначала подключение 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' );
// объявляем URL файла, который обрабатывает 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 ()
)
);
Теперь JavaScript, который делает Ajax вызов:
console.log("-- SeamlessDonationsCheckout: перед jQuery.post");
console.log("-- SeamlessDonationsCheckout: ajaxurl=" + dgxDonateAjax.ajaxurl);
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
success: function() {
console.log("-- SeamlessDonationsCheckout: jQuery.ajax успешно");
//response(data);
}
});
//jQuery.post(dgxDonateAjax.ajaxurl, data, SeamlessDonationsAjaxCallback);
console.log("-- SeamlessDonationsCheckout: после jQuery.post");
Массив данных состоит из:
var data = {
action: 'dgx_donate_paypalstd_ajax_checkout',
referringUrl: referringUrl,
nonce: nonce,
sessionID: sessionID,
donationAmount: donationAmount,
(и так далее, это большой массив)
};
Хуки:
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' );
И, наконец, начало PHP Ajax функции:
function dgx_donate_paypalstd_ajax_checkout () {
// Логирование
dgx_donate_debug_log ( '----------------------------------------' );
dgx_donate_debug_log ( 'НАЧАЛО ТРАНЗАКЦИИ ПОЖЕРТВОВАНИЯ' );
$php_version = phpversion ();
dgx_donate_debug_log ( "Версия PHP: $php_version" );
dgx_donate_debug_log ( "Версия Seamless Donations: " . dgx_donate_get_version () );
В Chrome лог-файл четко показывает, что функция была вызвана, но в Firefox ничего нет. Также в Chrome лог браузера показывает записи до и после вызовов jQuery.ajax, включая запись "success", но в Firefox этого нет.
Я могу подтвердить, что переменная для Ajax URL передается, потому что это сообщение
"-- SeamlessDonationsCheckout: ajaxurl=http://podtrack.com/wp-admin/admin-ajax.php"
отображается в консоли Firefox. Так что дело не в том, что ajax URL не передается.
Буду очень признателен за любые подсказки. Эта проблема меня полностью поставила в тупик.
Спасибо!
--Дэвид

Это минимальный код для AJAX-запроса и ответа. Убедитесь, что он работает в Chrome и Firefox — у меня всё работает.
<?php
// Функция для получения данных, которые мы передадим
function dgx_donate_get_countries_requiring_postal_code()
{
return "информация о почтовом коде страны...";
}
// Регистрируем всё необходимое
add_action('init', function () {
// Подключаем необходимые скрипты
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');
// Локализуем наши данные
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()
)
);
// Регистрируем обработчики 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');
// Обработчик AJAX (для авторизованных и неавторизованных пользователей)
function dgx_donate_paypalstd_ajax_checkout()
{
// Если что-то пошло не так, сообщаем об этом
$fail_message = '';
if (empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'dgx-donate-nonce')) $fail_message = 'Неверный Nonce';
if (empty ($_POST['action'])) $fail_message = 'Отсутствует Action';
if ($_POST['action'] !== 'dgx_donate_paypalstd_ajax_checkout') $fail_message = 'Неверный Action';
// Если обнаружена ошибка, сообщаем об этом...
if (!empty ($fail_message)) {
wp_send_json_error(array(
'message' => $fail_message
)); // завершаем выполнение
}
// Выполняем логику
// Отправляем успешный ответ
wp_send_json_success(array(
'action' => $_POST['action'],
'message' => 'Оплата завершена',
'postalCodeRequired' => $_POST['postalCodeRequired'],
'ID' => 1
)); // завершаем выполнение
}
});
// Быстрый способ вызвать AJAX-запрос при загрузке страницы
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) {
// анализируем ответ
if (response.success) {
// успешные данные
console.log(response.data);
} else {
// что-то пошло не так
console.log(response);
}
}
});
})(jQuery);
</script>
<?php });

Вам необходимо
type: 'POST'
в вашем вызове jQuery.ajax. По умолчанию используется GET, а здесь требуется POST.
Так как кто-то ниже попросил пример:
jQuery.ajax({
url: dgxDonateAjax.ajaxurl,
data: data,
type: 'POST',
success: function() {
console.log("-- SeamlessDonationsCheckout: jQuery.ajax success");
//response(data);
}
});

Я думаю, response
тоже должен быть в аргументах функции?? success: function(response) {
