Probleme cu Ajax returnând o pagină HTML completă ca răspuns
Știu că această problemă a mai fost întâlnită, dar niciuna dintre soluțiile găsite nu pare să funcționeze în cazul meu.
Problema este următoarea: de fiecare dată când trimit formularul, în consolă primesc ca răspuns întreaga pagină HTML în loc de un simplu mesaj.
Scriptul de backend:
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' );
// Callback pentru verificarea emailului
function verify_and_sanitize_email_form() {
// Verifică referer-ul
check_ajax_referer( '9pU0Pk7T01', 'security' );
if(empty($_POST) || !isset($_POST['rguroo_email']) || !isset($_POST['rguroo_email_confirmation']) || !isset($_POST['rguroo_desired_action'])) {
echo 'Unul sau mai multe câmpuri sunt goale';
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 'Emailul nu este valid';
wp_die();
}
if($sanitized_email !== $sanitized_email_confirmation) {
echo 'Emailurile nu coincid';
wp_die();
}
if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
echo 'Eroare fatală cu butoanele radio';
wp_die();
}
if(!isset($_COOKIE['rguroo_form_type'])) {
echo 'Eroare de server';
wp_die();
}
// Logica de verificare a emailului de student
$form_type = $_COOKIE['rguroo_form_type'];
if($form_type === 'student') {
$trail = substr($sanitized_email, -4);
if($trail !== '.edu') {
echo 'Nu este un email valid de student';
wp_die();
}
// Alte verificări specifice universității aici
}
setcookie('rguroo_form_action',$desired_action, 14 * DAY_IN_SECONDS);
setcookie('rguroo_form_email', $sanitized_email, 14 * DAY_IN_SECONDS);
echo "success";
wp_die();
}
JavaScript pe frontend:
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 !== 'success') {
jQuery('.error').html(response);
} else {
location.reload();
}
},
fail : function( err ) {
jQuery('.error').html("Nu se poate contacta serverul");
}
});
return false;
});
});
Formular (folosit într-un shortcode):
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="Achiziționează acces 12 luni" value="purchase" name="rguroo_desired_action" checked>Achiziționează acces 12 luni</input>
<input type="radio" label="Reînnoiește contul" name="rguroo_desired_action" value="renewal">Reînnoiește contul</input>
<input type="radio" label="Creează cont trial" name="rguroo_desired_action" value="trial">Creează cont trial</input>
<p class="form-subtext">* indică câmp obligatoriu</p>
<p>Adresă email*</p>
<input type="text" name="rguroo_email" required>
<p>Rescrie adresa email*</p>
<input type="text" name="rguroo_email_confirmation" required>
<input type="hidden" name="action" value="email_verification_form">
<input type="submit" value="Trimite">
</form>';
}
Lucruri pe care le știu: nu este o problemă cu trimiterea post-ului prin jQuery (sau cel puțin crearea cererii). La submit, jQuery trimite post-ul cu toți parametrii corecți. De asemenea, știu că nu folosesc nonce-uri diferite. Am încercat să plasez error_logs() peste tot în funcția de callback, dar niciunul nu a apărut în debug.log. Asta mă face să cred că callback-ul nu este niciodată apelat, dar nu înțeleg de ce. De asemenea, chiar dacă testez formularul cu date care ar trebui să eșueze, jQuery tot îl citește ca succes.
Am pierdut toată ziua cu acest formular și mă simt ca un idiot. Poate cineva mai inteligent decât mine să-mi spună unde greșesc?
Vă mulțumesc foarte mult.
Nu asta este. Există deja o acțiune. Din formular: <input type="hidden" name="action" value="email_verification_form">
, din javascript: var form_data = jQuery(this).serializeArray();
. Este inclusă când serializez formularul. Doar ca o verificare, am folosit instrumentele de dezvoltare și am verificat parametrii cu care era trimisă solicitarea mea POST. După cum puteți vedea din această captură de ecran, parametrii sunt setați și trimisi corect

Un apel la această funcție completează funcția die() din PHP. Diferența este că HTML-ul va fi afișat utilizatorului în cazul unei cereri web tipice
Preluat de aici
Ai încercat să folosești die()
în loc de wp_die()
sau exit()
?

O problemă în codul tău legată de hook-ul AJAX și acțiunea formularului în shortcode
Schimbă codul tău și testează
Codul este oferit mai jos
functions.php
function enqueue_scripts() {
// Încarcă CSS
//wp_enqueue_style('wp-news-search', plugins_url('/css/wp-news-search.css', __FILE__));
// Încarcă și localizează 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' );
// Callback pentru verificarea emailului
function verify_and_sanitize_email_form() {
// Verifică referer
check_ajax_referer( '9pU0Pk7T01', 'security' );
parse_str($_POST['data'], $data);
if(empty($_POST) || !isset($data['rguroo_email']) || !isset($data['rguroo_email_confirmation']) || !isset($data['rguroo_desired_action'])) {
echo 'Există unul sau mai multe câmpuri goale';
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 'Email-ul nu este valid';
wp_die();
}
if($sanitized_email !== $sanitized_email_confirmation) {
echo 'Email-urile nu se potrivesc';
wp_die();
}
if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
echo 'Eroare fatală la butoanele radio';
wp_die();
}
if(!isset($_COOKIE['rguroo_form_type'])) {
echo 'Eroare de server';
wp_die();
}
// Logică de verificare email student
$form_type = $_COOKIE['rguroo_form_type'];
if($form_type === 'student') {
$trail = substr($sanitized_email, -4);
if($trail !== '.edu') {
echo 'Nu este un email valid de student';
wp_die();
}
// Alte logici specifice universității aici
}
setcookie('rguroo_form_action',$desired_action, 14 * DAY_IN_SECONDS);
setcookie('rguroo_form_email', $sanitized_email, 14 * DAY_IN_SECONDS);
echo "success";
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="Cumpără acces 12 luni" value="purchase" name="rguroo_desired_action" checked>Cumpără acces 12 luni</input>
<input type="radio" label="Reînnoiește cont" name="rguroo_desired_action" value="renewal">Reînnoiește cont</input>
<input type="radio" label="Creează cont trial" name="rguroo_desired_action" value="trial">Creează cont trial</input>
<p class="form-subtext">* indică câmp obligatoriu</p>
<p>Adresă email*</p>
<input type="text" name="rguroo_email" required>
<p>Rescrie adresa email*</p>
<input type="text" name="rguroo_email_confirmation" required>
<input type="hidden" name="action" value="email_verification_form">
<input type="submit" value="Trimite">
</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 !== 'success') {
jQuery('p.error').html(response);
} else {
location.reload();
}
},
fail : function( err ) {
jQuery('.error').innerHTML = "Nu se poate contacta serverul";
}
});
return false;
});
});

Aceasta ar putea funcționa. Găsește div-ul tău după numele clasei din răspuns și obține innerHTML-ul acestuia.
success : function( response ) {
var error = $(response).find('.error-div')[0].innerHTML;
if(response !== 'success') {
jQuery('.error').innerHTML = error;
}
