Вопрос или проблема
Я пытался понять AJAX в течение последних 12 часов и постепенно теряю терпение. Как я могу просто передать две основные даты через форму или любым другим способом, не обновляя страницу, и выполнить PHP-функцию, которая содержит JS-скрипт?
Перед тем, как я передам значения скрипту, я просто хочу вывести массив данных, который я передаю, чтобы увидеть, работает ли AJAX. Кнопка формы просто обновляет страницу, независимо от всего, так что я не думаю, что AJAX вообще срабатывает. Я пробую на https://localhost для xampp. Я не знаю, что не хватает, чтобы остановить обновление и запустить AJAX-скрипт по нажатию кнопки.
Буду признателен за любые идеи.
functions.php
<?php
add_action('wp_enqueue_scripts','enqueue_parent_styles');
add_action('wp_ajax_nopriv_lineChartCustom', 'lineChartCustomCreate');
add_action('wp_ajax_lineChartCustom', 'lineChartCustomCreate');
function lineChartCustomCreate(){
if ( isset( $_POST['dataForPHP'])){
//вывод массива данных
echo $dataForPHP;
//<script>Некоторые скрипты для генерации графиков с использованием массива данных</script>
}
}
?>
page-template.php
<?php
echo "<form id='my-form'>
Выберите диапазон дат:
<input type='date' name='date1'>
<input type='date' name='date2'>
<input type='submit' id='submit' value='отправить'>
</form>";
?>
<script>
jQuery('#submit').on('click', function() {
let formData = jQuery('#my-form').serializeArray(); // получает данные формы в виде массива
jQuery.ajax({
url: ajaxurl, // стандартный ajax url WordPress
type: 'POST',
data: {
action: 'lineChartCustom', // используйте это действие для обработки события
dataForPHP: formData // это данные вашей формы, которые будут отправлены в PHP под именем dataForPHP
});
});
});
</script>
Вы должны добавить wp_die();
в конце вашей PHP-функции.
Но вы также можете отправить ответ с помощью wp_send_json
, wp_send_json_error
или wp_send_json_success
. Эти функции также завершают выполнение функции.
Страница обновляется, потому что вы отправляете форму синхронно (традиционно). Чтобы отправить форму с помощью AJAX, ваша функция, подключенная к onclick
, должна вернуть false
или вызвать .preventDefault()
на событии отправки.
jQuery( "#my-form" ).submit(function( event ) {
event.preventDefault();
//
// ваш код...
});
// --- или ---
jQuery('#submit').on('click', function() {
// ....
return false;
});
Правка:
Переместите ваш javascript-код в отдельный файл (например, myscript.js
). Включите этот файл на странице, используя wp_enqueue_scripts()
(хук). В коде вы использовали ajaxurl
, но нигде не определили его. wp_localize_script()
используется для передачи значений из PHP в javascript, таким образом вы установите адрес для AJAX в переменной ajax_url
.
page-template.php:
<?php
echo "<form id='my-form'>
Выберите диапазон дат:
<input type='date' name='date1'>
<input type='date' name='date2'>
<input type='submit' id='submit' value='отправить'>
</form>";
?>
myscript.js:
jQuery('#submit').on('click', function() {
let formData = jQuery('#my-form').serializeArray(); // получает данные формы в виде массива
jQuery.ajax({
url: ajax_object.ajax_url, // стандартный ajax url WordPress
type: 'POST',
data: {
action: 'lineChartCustom', // используйте это действие для обработки события
dataForPHP: formData // это данные вашей формы, которые будут отправлены в PHP под именем dataForPHP
}
}).done(function( msg ) {
alert( msg );
});
return false;
});
functions.php
add_action( 'wp_enqueue_scripts', 'my_enqueue' );
function my_enqueue() {
wp_enqueue_script( 'my-javascript', get_stylesheet_directory_uri(). '/myscript.js', array('jquery'), '', true );
// в JavaScript свойства объектов обращаются как ajax_object.ajax_url
wp_localize_script( 'my-javascript', 'ajax_object',
array( 'ajax_url' => admin_url('admin-ajax.php') ) );
}
add_action('wp_enqueue_scripts','enqueue_parent_styles');
add_action('wp_ajax_nopriv_lineChartCustom', 'lineChartCustomCreate');
add_action('wp_ajax_lineChartCustom', 'lineChartCustomCreate');
function lineChartCustomCreate(){
if ( isset( $_POST['dataForPHP']) ){
//вывод массива данных
print_r($_POST['dataForPHP']);
}
die();
}
Ответ или решение
Решение проблемы с выполнением AJAX-скрипта для вызова функции в PHP
Если вы столкнулись с проблемами при выполнении AJAX-скрипта для вызова функции в functions.php
, и ваша страница перезагружается вместо выполнения AJAX-запроса, это может быть вызвано несколькими факторами. Рассмотрим, как правильно настроить AJAX в WordPress и избежать перезагрузки страницы.
Шаг 1: Настройка формы
Ваш код формы на page-template.php
выглядит правильно, но мы внесем несколько улучшений для гарантии, что AJAX будет работать корректно. Важно использовать event.preventDefault()
в обработчике события для предотвращения перезагрузки страницы:
<?php
echo "<form id='my-form'>
Select Date Range:
<input type='date' name='date1'>
<input type='date' name='date2'>
<input type='submit' id='submit' value='submit'>
</form>";
?>
<script>
// Изолируем весь JavaScript в функцию, чтобы убедиться, что документ загружен
jQuery(document).ready(function($) {
$('#my-form').on('submit', function(event) {
event.preventDefault(); // Предотвращаем стандартное поведение формы
let formData = $(this).serializeArray(); // Получаем данные формы в виде массива
$.ajax({
url: ajax_object.ajax_url, // URL для AJAX-запроса
type: 'POST',
data: {
action: 'lineChartCustom', // Действие для обработки в PHP
dataForPHP: formData // Данные, которые отправляются на сервер
},
success: function(response) {
alert('Ответ от PHP: ' + response); // Обработка успешного ответа
},
error: function(jqXHR, textStatus, errorThrown) {
alert('Ошибка: ' + textStatus + ' - ' + errorThrown); // Обработка ошибок
}
});
});
});
</script>
Шаг 2: Подключение скрипта в functions.php
Теперь необходимо убедиться, что ваш скрипт будет корректно подключен, и AJAX URL будет доступен. Используйте функцию wp_enqueue_script()
и wp_localize_script()
:
add_action('wp_enqueue_scripts', 'my_enqueue');
function my_enqueue() {
wp_enqueue_script('my-javascript', get_stylesheet_directory_uri() . '/myscript.js', ['jquery'], null, true);
// Передаем данные обратно в JavaScript
wp_localize_script('my-javascript', 'ajax_object', [
'ajax_url' => admin_url('admin-ajax.php') // URL для AJAX-запросов WordPress
]);
}
Шаг 3: Обработка AJAX-запроса в functions.php
В вашей функции lineChartCustomCreate
необходимо убедиться, что данные корректно принимаются и возвращаются. Также добавьте wp_die()
в конце функции для корректной остановки выполнения:
add_action('wp_ajax_nopriv_lineChartCustom', 'lineChartCustomCreate');
add_action('wp_ajax_lineChartCustom', 'lineChartCustomCreate');
function lineChartCustomCreate() {
if (isset($_POST['dataForPHP'])) {
// Здесь вы можете обрабатывать ваши данные
echo 'Полученные данные: ';
print_r($_POST['dataForPHP']); // Отправляем данные обратно как пример
}
wp_die(); // Завершаем выполнение
}
Шаг 4: Проверка
После внесения этих изменений, выполните тестирование:
- Запустите ваш локальный сервер XAMPP.
- Откройте страницу с вашей формой.
- Выберите даты и нажмите «submit».
Если все выполнено правильно, вы должны получить всплывающее окно с ответом от PHP без перезагрузки страницы. Это отличное первое испытание для использования AJAX в вашем проекте.
Заключение
Работа с AJAX в WordPress может показаться сложной на первых порах, но следуя этим шагам, вы сможете настроить корректную обработку запросов. Убедитесь также, что отладку проводите в консоли браузера, где можно проверить, отправляются ли AJAX-запросы и получаете ли вы необходимые ответы от сервера. Надеюсь, эти рекомендации помогут вам разобраться в ваших затруднениях!