Вопрос или проблема
Я знаю, что этот вопрос часто задавался здесь, но ни одно из найденных мной решений не кажется работающим для меня.
Проблема заключается в следующем: всякий раз, когда я отправляю форму, в консоли появляется лог с ответом, который является полной HTML-страницей, а не простым сообщением.
Скрипт на стороне сервера:
add_action( 'admin_ajax_nopriv_email_verification_form', 'verify_and_sanitize_email_form' );
add_action( 'admin_ajax_email_verification_form', 'verify_and_sanitize_email_form' );
// Коллбек для верификации по электронной почте
function verify_and_sanitize_email_form() {
// Проверка реферера
check_ajax_referer( '9pU0Pk7T01', 'security' );
if(empty($_POST) || !isset($_POST['rguroo_email']) || !isset($_POST['rguroo_email_confirmation']) || !isset($_POST['rguroo_desired_action'])) {
echo 'Одно или несколько полей пусты';
wp_die();
}
$sanitized_email = sanitize_email( esc_html($_POST['rguroo_email'] ));
$sanitized_email_confirmation = sanitize_email( esc_html($_POST['rguroo_email_confirmation'] ));
$desired_action = esc_html($_POST['rguroo_desired_action']);
if(!is_email( $sanitized_email ) || !is_email( $sanitized_email_confirmation )) {
echo 'Электронная почта недействительна';
wp_die();
}
if($sanitized_email !== $sanitized_email_confirmation) {
echo 'Электронные адреса не совпадают';
wp_die();
}
if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
echo 'Серьезная ошибка с радиокнопками';
wp_die();
}
if(!isset($_COOKIE['rguroo_form_type'])) {
echo 'Ошибка сервера';
wp_die();
}
// Логика верификации электронной почты студентов
$form_type = $_COOKIE['rguroo_form_type'];
if($form_type === 'student') {
$trail = substr($sanitized_email, -4);
if($trail !== '.edu') {
echo 'Недействительный студенческий адрес электронной почты';
wp_die();
}
// Здесь может быть другая специфическая логика университета
}
setcookie('rguroo_form_action',$desired_action, 14 * DAY_IN_SECONDS);
setcookie('rguroo_form_email', $sanitized_email, 14 * DAY_IN_SECONDS);
echo "успех";
wp_die();
}
Скрипт на стороне клиента:
jQuery(document).ready(function () {
jQuery('form#email-verification').on( 'submit', function () {
var form_data = jQuery(this).serializeArray();
form_data.push( { "name" : "security", "value" : ajax_info.ajax_nonce } );
jQuery.ajax({
url : ajax_info.ajax_url,
type : 'post',
data : form_data,
success : function( response ) {
console.log(response);
if(response !== 'успех') {
jQuery('.error').innerHTML = response;
} else {
location.reload();
}
},
fail : function( err ) {
jQuery('.error').innerHTML = "Не удается установить связь с сервером";
}
});
return false;
});
});
Форма (используемая в шорткоде):
function output_email_verification() {
return '<form action="'.esc_url( admin_url("admin-ajax.php") ).'" method="post" id="email-verification">
<p class="error">'.$error.'</p>
<input type="radio" label="Купить доступ на 12 месяцев" value="purchase" name="rguroo_desired_action" checked>Купить доступ на 12 месяцев</input>
<input type="radio" label="Продлить аккаунт" name="rguroo_desired_action" value="renewal">Продлить аккаунт</input>
<input type="radio" label="Создать пробный аккаунт" name="rguroo_desired_action" value="trial">Создать пробный аккаунт</input>
<p class="form-subtext">* обязательное поле</p>
<p>Электронный адрес*</p>
<input type="text" name="rguroo_email" required>
<p>Повторите электронный адрес*</p>
<input type="text" name="rguroo_email_confirmation" required>
<input type="hidden" name="action" value="email_verification_form">
<input type="submit" value="Отправить">
</form>';
}
Что я знаю: проблемы с отправкой поста jQuery (или по крайней мере с отправкой POST-запроса) нет. При отправке jQuery отправляет пост со всеми правильными параметрами. Я также знаю, что я не использую разные nonce. Я пробовал вставлять error_logs() в разных местах коллбек-функции, но ни одно из них никогда не отображалось в debug.log. Это приводит меня к мысли, что коллбек никогда не вызывается, но я не знаю, почему. Также, даже если я даю форме тест, который должен завершиться неудачей, jQuery все равно воспринимает это как успех.
Я потратил весь день на эту форму и чувствую себя идиотом. Мог бы кто-то с немного большим количеством мозгов, чем у меня, сказать мне, где я неправ?
Большое спасибо.
Вызов этой функции дополняет функцию die() PHP. Разница в том, что HTML будет отображаться пользователю в случае типичного веб-запроса
Взято отсюда здесь
Вы пробовали использовать die()
вместо wp_die()
или exit()
?
вам нужно указать действие в вашем AJAX-запросе, чтобы вызвать функцию PHP
url : ajax_info.ajax_url,
type : 'post',
data : form_data,
action: email_output_verification,
Эта проблема возникает, когда имя PHP-файла в AJAX-вызове недействительно.
Например:
$.post
(
'ajax.phpp',
variables,
[...]
Правильный способ:
$.post
(
'ajax.php',
variables,
[...]
Некоторые проблемы в вашем коде, такие как действие AJAX и форма, использующая шорткод
Измените свой код и протестируйте
Код ниже
functions.php
function enqueue_scripts() {
// Подключите CSS
//wp_enqueue_style('wp-news-search', plugins_url('/css/wp-news-search.css', __FILE__));
// Подключите и локализуйте JS
wp_enqueue_script('ajax-script', get_template_directory_uri().'/js/wp-news-search_query.js', array('jquery'), null, true);
wp_localize_script('ajax-script', 'ajax_info',
array('ajax_url' => admin_url('admin-ajax.php'),
'security' => wp_create_nonce('9pU0Pk7T01'),
));
}
add_action( 'wp_ajax_no_email_verification_form', 'verify_and_sanitize_email_form' );
add_action( 'wp_ajax_email_verification_form', 'verify_and_sanitize_email_form' );
// Коллбек для верификации по электронной почте
function verify_and_sanitize_email_form() {
// Проверка реферера
check_ajax_referer( '9pU0Pk7T01', 'security' );
// echo "string";
parse_str($_POST['data'], $data);
if(empty($_POST) || !isset($data['rguroo_email']) || !isset($data['rguroo_email_confirmation']) || !isset($data['rguroo_desired_action'])) {
echo 'Одно или несколько полей пусты';
wp_die();
}
$sanitized_email = sanitize_email( esc_html($data['rguroo_email'] ));
$sanitized_email_confirmation = sanitize_email( esc_html($data['rguroo_email_confirmation'] ));
$desired_action = esc_html($data['rguroo_desired_action']);
if(!is_email( $sanitized_email ) || !is_email( $sanitized_email_confirmation )) {
echo 'Электронная почта недействительна';
wp_die();
}
if($sanitized_email !== $sanitized_email_confirmation) {
echo 'Электронные адреса не совпадают';
wp_die();
}
if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
echo 'Серьезная ошибка с радиокнопками';
wp_die();
}
if(!isset($_COOKIE['rguroo_form_type'])) {
echo 'Ошибка сервера';
wp_die();
}
// Логика верификации электронной почты студентов
$form_type = $_COOKIE['rguroo_form_type'];
if($form_type === 'student') {
$trail = substr($sanitized_email, -4);
if($trail !== '.edu') {
echo 'Недействительный студенческий адрес электронной почты';
wp_die();
}
// Здесь может быть другая специфическая логика университета
}
setcookie('rguroo_form_action',$desired_action, 14 * DAY_IN_SECONDS);
setcookie('rguroo_form_email', $sanitized_email, 14 * DAY_IN_SECONDS);
echo "успех";
wp_die();
}
add_shortcode('wp_news_search','wp_news_search_form');
function wp_news_search_form() {
return '<form id="email-verification">
<p class="error">'.$error.'</p>
<input type="radio" label="Купить доступ на 12 месяцев" value="purchase" name="rguroo_desired_action" checked>Купить доступ на 12 месяцев</input>
<input type="radio" label="Продлить аккаунт" name="rguroo_desired_action" value="renewal">Продлить аккаунт</input>
<input type="radio" label="Создать пробный аккаунт" name="rguroo_desired_action" value="trial">Создать пробный аккаунт</input>
<p class="form-subtext">* обязательное поле</p>
<p>Электронный адрес*</p>
<input type="text" name="rguroo_email" required>
<p>Повторите электронный адрес*</p>
<input type="text" name="rguroo_email_confirmation" required>
<input type="hidden" name="action" value="email_verification_form">
<input type="submit" value="Отправить">
</form>';
}
Js
jQuery(document).ready(function () {
jQuery('#email-verification').submit(function (event) {
event.preventDefault();
var form_data = jQuery(this).serialize();
jQuery.ajax({
url : ajax_info.ajax_url,
type : 'post',
data: {
action: 'email_verification_form',
data: form_data,
security: ajax_info.security
},
success : function( response ) {
console.log(response);
if(response !== 'успех') {
jQuery('p.error').html(response);
} else {
location.reload();
}
},
fail : function( err ) {
jQuery('.error').innerHTML = "Не удается установить связь с сервером";
}
});
return false;
});
});
Это может сработать. Найдите свой div по имени класса из ответа и получите его innerHTML.
success : function( response ) {
var error = $(response).find('.error-div')[0].innerHTML;
if(response !== 'успех') {
jQuery('.error').innerHTML = error;
}
Ответ или решение
Проблема, с которой вы столкнулись, заключается в получении полного HTML-документа в ответ на AJAX-запрос вместо ожидаемого простого сообщения. Давайте рассмотрим возможные причины этой проблемы и предложим решения, основываясь на вашем коде и описании.
1. Проверка правильности JavaScript запроса
Первым делом, убедитесь, что AJAX-запрос формируется корректно. При использовании jQuery.ajax
, необходимо убедиться, что все параметры отправляются должным образом, включая действие и защитный токен запроса. В вашем коде вы передаете action
в объекте данных:
data: {
action: 'email_verification_form',
data: form_data,
security: ajax_info.security
},
2. Правильное использование AJAX хука
Убедитесь, что вы правильно регистрируете AJAX-действия в вашем коде. Это делает с помощью add_action
:
add_action( 'wp_ajax_nopriv_email_verification_form', 'verify_and_sanitize_email_form' );
add_action( 'wp_ajax_email_verification_form', 'verify_and_sanitize_email_form' );
Убедитесь, что название действия (email_verification_form
) совпадает как на стороне клиента, так и на стороне сервера.
3. Проверка и отладка серверной части
Ваша серверная функция verify_and_sanitize_email_form
выполняет множество проверок, и в случае ошибки вы возвращаете ответ между wp_die()
. Убедитесь, что функция корректно обрабатывает все возможные ошибки и данные:
if(empty($_POST) || !isset($_POST['rguroo_email']) || !isset($_POST['rguroo_email_confirmation']) || !isset($_POST['rguroo_desired_action'])) {
echo 'There is one or more empty fields';
wp_die();
}
Также стоит убедиться, что все данные, которые оцениваются, действительно присутствуют в массиве $_POST
.
4. Возможная проблема с редиректами
Если в вашем коде возникает ошибка или происходит редирект во время обработки запроса (например, если не проходится проверка безопасности или неверный ввод), это может привести к возврату полного HTML-документа. Убедитесь, что:
- Страница, на которую происходит запрос, настроена на обработку AJAX.
- В вашем коде нет условий, которые могут вызывать перенаправление.
5. Использование wp_die()
wp_die()
является мощным инструментом и используется для завершения скрипта с фатальной ошибкой. Убедитесь, что, когда вы вызываете этот метод, вы не возвращаете ничего лишнего (например, HTML-код). Если вы видите, что функция verify_and_sanitize_email_form
никогда не вызывается, это может объяснять, почему вы видите полный HTML в ответ.
Рекомендации и оптимизация
- Используйте инструменты разработчика браузера (например, вкладка "Network") для проверки ответа на AJAX-запрос. Это поможет понять, какой именно ответ приходит от сервера.
- Убедитесь, что все пути к скриптам, стилам, тегам и переменным определены правильно.
- Добавьте дополнительные журналы ошибок (
error_log()
) для отслеживания выполнения функции.
Заключение
Если после всех этих проверок проблема не исчезает, попробуйте упростить ваш код до минимального рабочего примера. Это поможет изолировать проблему и найти точное место, где все идет не так. И всегда помните, что тестирование ошибок в таком сложном окружении, как WordPress, требует детальной проверки на каждом этапе выполнения кода.