Probleme cu Ajax returnând o pagină HTML completă ca răspuns

20 iun. 2019, 00:06:13
Vizualizări: 14.4K
Voturi: 1

Ș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.

2
Comentarii

Nu ar trebui să folosești echo în PHP, utilizează wp_send_json pentru răspunsul către JavaScript.

Nathan Powell Nathan Powell
20 iun. 2019 00:24:46

@NathanPowell Am încercat să modific codul dar încă nu funcționează. Am folosit asta pentru erori: wp_send_json_error(array('error'=>'Email-ul nu este valid')); și am un wp_send_json_success(); la sfârșit. Un lucru de menționat este că introduc "test" și "test" în ambele câmpuri de email. Ceea ce înseamnă că răspunsul ar trebui să eșueze cu wp_send_json_error(). Totuși, încă reușește și afișează pagina în consolă

Eli Eli
20 iun. 2019 00:37:23
Toate răspunsurile la întrebare 5
1

ai nevoie de o acțiune în cererea ta AJAX pentru a apela o funcție PHP

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

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

Eli Eli
20 iun. 2019 07:46:33
1

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

20 iun. 2019 10:37:12
Comentarii

Încă nu funcționează. În plus, dacă callback-ul ar funcționa corect, cazul de test pe care îl folosesc ar eșua, ceea ce ar duce la faptul că nimic nu ar fi afișat în consolă. Cu alte cuvinte, nu cred că ajung nici măcar la wp_die()

Eli Eli
20 iun. 2019 12:28:20
0

Această problemă apare atunci când numele fișierului PHP din apelul AJAX este invalid.

De exemplu:

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

Acesta ar fi modul corect:

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

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

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;
              }
3 mai 2021 16:05:46