Richiesta Ajax che restituisce una pagina HTML completa come risposta
So che questa domanda è stata fatta spesso qui, ma nessuna delle soluzioni che ho trovato sembra funzionare nel mio caso.
Il problema è il seguente: ogni volta che invio il modulo, ottengo un log della console con la risposta che è una pagina HTML completa invece di un semplice messaggio.
Script backend:
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' );
// Callback per la verifica dell'email
function verify_and_sanitize_email_form() {
// Verifica il referer
check_ajax_referer( '9pU0Pk7T01', 'security' );
if(empty($_POST) || !isset($_POST['rguroo_email']) || !isset($_POST['rguroo_email_confirmation']) || !isset($_POST['rguroo_desired_action'])) {
echo 'Uno o più campi sono vuoti';
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 'L\'email non è valida';
wp_die();
}
if($sanitized_email !== $sanitized_email_confirmation) {
echo 'Le email non corrispondono';
wp_die();
}
if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
echo 'Errore fatale con i radio button';
wp_die();
}
if(!isset($_COOKIE['rguroo_form_type'])) {
echo 'Errore del server';
wp_die();
}
// Logica di verifica dell'email studente
$form_type = $_COOKIE['rguroo_form_type'];
if($form_type === 'student') {
$trail = substr($sanitized_email, -4);
if($trail !== '.edu') {
echo 'Non è un\'email studente valida';
wp_die();
}
// Altre logiche specifiche per l'università qui
}
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 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').innerHTML = response;
} else {
location.reload();
}
},
fail : function( err ) {
jQuery('.error').innerHTML = "Impossibile contattare il server";
}
});
return false;
});
});
Modulo (usato in uno 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="Acquista 12 mesi di accesso" value="purchase" name="rguroo_desired_action" checked>Acquista 12 mesi di accesso</input>
<input type="radio" label="Rinnova account" name="rguroo_desired_action" value="renewal">Rinnova account</input>
<input type="radio" label="Crea account di prova" name="rguroo_desired_action" value="trial">Crea account di prova</input>
<p class="form-subtext">* indica un campo obbligatorio</p>
<p>Indirizzo email*</p>
<input type="text" name="rguroo_email" required>
<p>Re-inserisci l'indirizzo email*</p>
<input type="text" name="rguroo_email_confirmation" required>
<input type="hidden" name="action" value="email_verification_form">
<input type="submit" value="Invia">
</form>';
}
Cose che so: non c'è un problema con jQuery che invia il post (o almeno che effettua la richiesta post). All'invio jQuery invia il post con tutti i parametri corretti. So anche che non sto usando nonce diversi. Ho provato a inserire error_log() in tutto il callback, ma nessuno di questi è mai apparso in debug.log. Questo mi porta a pensare che il callback non venga mai effettivamente chiamato, ma non so perché. Inoltre, anche se fornisco al modulo un test che dovrebbe fallire, jQuery lo legge comunque come successo.
Ho perso tutta la giornata con questo modulo e mi sento un idiota. Qualcuno con più neuroni di me potrebbe dirmi dove sto sbagliando?
Grazie mille.
Non è quello. C'è già un'azione. Dal form: <input type="hidden" name="action" value="email_verification_form">
, dal javascript: var form_data = jQuery(this).serializeArray();
. Viene incluso quando serializzo il form. Solo per un controllo di correttezza ho usato gli strumenti di sviluppo e ho guardato i parametri che il mio post stava inviando. Come puoi vedere da questo screenshot, i parametri vengono impostati e inviati correttamente

Una chiamata a questa funzione complementa la funzione die() di PHP. La differenza è che l'HTML verrà visualizzato all'utente nel caso di una tipica richiesta web
Tratto da qui
Hai provato a usare die()
invece di wp_die()
o exit()
?

Alcuni problemi nel tuo codice come un hook ajax fire e Form Action nello shortcode
Modifica il tuo codice e testa
Codice fornito qui sotto
functions.php
function enqueue_scripts() {
// Caricamento CSS
//wp_enqueue_style('wp-news-search', plugins_url('/css/wp-news-search.css', __FILE__));
// Caricamento e localizzazione 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 di verifica email
function verify_and_sanitize_email_form() {
// Controllo referrer
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 'Ci sono uno o più campi vuoti';
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 non valida';
wp_die();
}
if($sanitized_email !== $sanitized_email_confirmation) {
echo 'Le email non corrispondono';
wp_die();
}
if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
echo 'Errore fatale con i pulsanti radio';
wp_die();
}
if(!isset($_COOKIE['rguroo_form_type'])) {
echo 'Errore del server';
wp_die();
}
// Logica di verifica email studente
$form_type = $_COOKIE['rguroo_form_type'];
if($form_type === 'student') {
$trail = substr($sanitized_email, -4);
if($trail !== '.edu') {
echo 'Email studente non valida';
wp_die();
}
// Altra logica specifica per università qui
}
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="Acquista accesso 12 mesi" value="purchase" name="rguroo_desired_action" checked>Acquista accesso 12 mesi</input>
<input type="radio" label="Rinnova account" name="rguroo_desired_action" value="renewal">Rinnova account</input>
<input type="radio" label="Crea account di prova" name="rguroo_desired_action" value="trial">Crea account di prova</input>
<p class="form-subtext">* indica campo obbligatorio</p>
<p>Indirizzo email*</p>
<input type="text" name="rguroo_email" required>
<p>Ripeti indirizzo email*</p>
<input type="text" name="rguroo_email_confirmation" required>
<input type="hidden" name="action" value="email_verification_form">
<input type="submit" value="Invia">
</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 = "Impossibile contattare il server";
}
});
return false;
});
});
