Вопрос или проблема
Я видел несколько методов, начиная с 2011 года, чтобы отправить данные формы через ajax.jquery. Я попробовал несколько из них и просто получаю перезагрузку страницы, несмотря на использование preventdefault functions
.
Я пытаюсь взять данные из моей формы, чтобы jQuery слушал событие отправки формы, нацеливаясь на фактический ID формы, а затем вызвать функцию PHP, чтобы эти данные были отправлены в базу данных. В конечном итоге ничего не происходит, кроме перезагрузки страницы. Поскольку это страница WP, я знаю, что некоторые функции и обработка отличаются от обычных веб-страниц. Такие вещи, как ajax url, могут быть возвращены обратно в функции и т.д. Вот почему я публикую это здесь.
форма:
function add_entry(){
?>
<form action="" method="post" id="ajax-add-to-form" autocomplete="off">
<input type="text" id="FName" name="FName" placeholder="Имя" value="" required>
<input type="text" id="LName" name="LName" placeholder="Фамилия" value="" required>
<select id="size" required>
<option value="">Размер</option>
<?php for($i=1; $i<=15; $i++){?>
<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
<?php } ?>
</select>
<input type="text" id="MobileNumber" name="MobileNumber" placeholder="Номер телефона" value="" required>
<input type="email" id="Customer_Email" name="Customer_Email" placeholder="Адрес электронной почты" value="" required>
<input type="submit" name="ajax-add-to-form" value="Добавить">
<?php
}
add_shortcode('add_entry', 'add_entry');
</form>
jquery
jQuery('document').ready( function(){
jQuery('#ajax-add-to-form').on('submit', function(e){
e.preventDefault();
jQuery('#jx-loading').show();
jQuery.ajax({
type: 'post',
url: my_ajax.ajax_url,
data: {
action: 'ajax-php-function'},
success: function(data)
{jQuery('#jx-loading').hide();}
})
});
return false;
});
php
function ajax-php-function() {
global $wpdb;
$table = "mytablename";
$FName= $_POST['FName'];
$LName= $_POST['LName'];
$MobileNumber= $_POST['MobileNumber'];
$Email = $_POST['Email '];
$data = array(
'FName' => $FName,
'LName' => $LName,
'MobileNumber' => $MobileNumber,
'Email' => $Email);
$success = $wpdb->insert( $table, $data );
if($success)
{echo json_encode($last_data);}
else{ echo 'error'; } die;
}
В конечном итоге форма и ее старый обработчик были испорчены другим элементом на сайте. Это мог быть WP или один из нескольких плагинов, которые я не мог удалить, так как это конструктор страниц (Elementor, Elementor Essentials). Отключив все остальные плагины, удалось сузить проблему до этого. Решение кода было:
….
jQuery(document).on('submit', '#ajax-add-to-waitlist-form', function(e){
e.preventDefault();
…….
Вместо этого
jQuery('#ajax-add-to-form').on('submit', function(e){
e.preventDefault();
Ответ или решение
Конечно, давайте разберем вашу ситуацию полностью и попробуем решить проблему с отправкой формы через AJAX в WordPress.
1. Структура формы
Сначала давайте убедимся, что ваша форма правильно настроена. В вашем коде есть несколько моментов, которые необходимо исправить. Вот исправленный код:
function add_entry(){
?>
<form action="" method="post" id="ajax-add-to-form" autocomplete="off">
<input type="text" id="FName" name="FName" placeholder="First Name" required>
<input type="text" id="LName" name="LName" placeholder="Last Name" required>
<select id="size" name="size" required>
<option value="">Size</option>
<?php for($i=1; $i<=15; $i++){ ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
<?php } ?>
</select>
<input type="text" id="MobileNumber" name="MobileNumber" placeholder="Phone Number" required>
<input type="email" id="Customer_Email" name="Customer_Email" placeholder="Email Address" required>
<input type="submit" name="ajax-add-to-form" value="Add to">
</form>
<?php
}
add_shortcode('add_entry', 'add_entry');
2. JavaScript для AJAX
Изменим JavaScript-код для правильного захвата события submit и передачи данных в AJAX-запросе. Также убедитесь, что вы правильно передаете данные формы:
jQuery(document).ready(function(){
jQuery(document).on('submit', '#ajax-add-to-form', function(e){
e.preventDefault();
jQuery('#jx-loading').show();
var formData = jQuery(this).serialize(); // Сериализуем данные формы
jQuery.ajax({
type: 'POST',
url: my_ajax.ajax_url,
data: formData + '&action=ajax-php-function', // Добавляем данные формы и действие
success: function(response) {
jQuery('#jx-loading').hide();
// Обработка успешного ответа
console.log(response);
// Вы можете добавить, что делать с ответом здесь
},
error: function() {
jQuery('#jx-loading').hide();
// Обработка ошибки
console.log('Ошибка при отправке AJAX-запроса');
}
});
return false; // Не обязательно, так как e.preventDefault() предотвращает стандартное поведение
});
});
3. PHP-обработчик AJAX-запроса
Теперь завершим настройку вашего PHP-кода так, чтобы он принимал данные правильно:
add_action('wp_ajax_ajax-php-function', 'ajax_php_function');
add_action('wp_ajax_nopriv_ajax-php-function', 'ajax_php_function'); // Для незарегистрированных пользователей
function ajax_php_function() {
global $wpdb;
$table = 'mytablename'; // Убедитесь, что таблица существует
// Получаем данные из запроса
$FName = isset($_POST['FName']) ? sanitize_text_field($_POST['FName']) : '';
$LName = isset($_POST['LName']) ? sanitize_text_field($_POST['LName']) : '';
$MobileNumber = isset($_POST['MobileNumber']) ? sanitize_text_field($_POST['MobileNumber']) : '';
$Customer_Email = isset($_POST['Customer_Email']) ? sanitize_email($_POST['Customer_Email']) : '';
$data = array(
'FName' => $FName,
'LName' => $LName,
'MobileNumber' => $MobileNumber,
'Email' => $Customer_Email
);
$success = $wpdb->insert($table, $data);
if ($success) {
echo json_encode(array('status' => 'success', 'message' => 'Данные успешно добавлены.'));
} else {
echo json_encode(array('status' => 'error', 'message' => 'Ошибка при добавлении данных.'));
}
wp_die(); // Обязательно используйте wp_die(), чтобы завершить выполнение скрипта
}
Общие рекомендации
-
Проверьте консоль: Если AJAX-запрос не работает, проверьте консоль разработчика (F12) в браузере на наличие ошибок JavaScript или проблем с запросами.
-
Функция wp_localize_script: Убедитесь, что вы используете функцию
wp_localize_script()
для передачиmy_ajax.ajax_url
в ваш JavaScript файл. Пример:function my_enqueue_scripts() { wp_enqueue_script('my_ajax_script', get_template_directory_uri() . '/js/my-ajax-script.js', array('jquery'), null, true); wp_localize_script('my_ajax_script', 'my_ajax', array('ajax_url' => admin_url('admin-ajax.php'))); } add_action('wp_enqueue_scripts', 'my_enqueue_scripts');
Эти изменения должны помочь вам правильно настроить форму, предотвратить её перезагрузку и передавать данные с помощью AJAX в вашем проекте на WordPress. Если у вас останутся вопросы, не стесняйтесь их задавать.