Richiesta Ajax che restituisce una pagina HTML completa come risposta

20 giu 2019, 00:06:13
Visualizzazioni: 14.4K
Voti: 1

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.

2
Commenti

Non dovresti usare echo nel tuo PHP, utilizza wp_send_json per la risposta al JavaScript.

Nathan Powell Nathan Powell
20 giu 2019 00:24:46

@NathanPowell Ho provato a modificare il codice ma ancora non funziona. Ho usato questo per gli errori: wp_send_json_error(array('error'=>'L\'email non è valida')); e ho un wp_send_json_success(); alla fine. Una cosa da notare è che sto inserendo "test" e "test" in entrambi i campi email. Il che significa che la risposta dovrebbe fallire con wp_send_json_error(). Tuttavia, ha ancora successo e stampa la pagina nella console

Eli Eli
20 giu 2019 00:37:23
Tutte le risposte alla domanda 5
1

hai bisogno di un'azione nella tua richiesta ajax per chiamare una funzione php

url : ajax_info.ajax_url,
type : 'post',
data : form_data,
action: email_output_verification,
20 giu 2019 03:34:09
Commenti

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

Eli Eli
20 giu 2019 07:46:33
1

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()?

20 giu 2019 10:37:12
Commenti

Ancora non funziona. Inoltre, se la callback funzionasse correttamente, il caso di test che sto utilizzando fallirebbe, il che risulterebbe in nessun log nella console. In altre parole, non credo di arrivare nemmeno a wp_die()

Eli Eli
20 giu 2019 12:28:20
0

Questo problema si verifica quando il nome del file PHP nella chiamata AJAX non è valido.

Ad esempio:

$.post
(       
  'ajax.phpp',
  variables,
  [...]

Questo sarebbe il modo corretto:

$.post
(       
  'ajax.php',
  variables,
  [...]
25 mar 2020 23:54:56
0

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;
  });
});
1 gen 2021 10:46:13
0

Potrebbe funzionare. Trova il tuo div per nome di classe dalla risposta e ottieni l'innerHTML di esso.

success : function( response ) {
              var error = $(response).find('.error-div')[0].innerHTML;
              if(response !== 'success') {
                jQuery('.error').innerHTML = error;
              }
3 mag 2021 16:05:46