WordPress

formularze – post Ajax zwracający pełną stronę HTML jako odpowiedź

  • 19 czerwca, 2019
  • 4 min read
formularze – post Ajax zwracający pełną stronę HTML jako odpowiedź


Wiem, że było to często zadawane tutaj, ale żadne z rozwiązań, które znalazłem, nie działa dla mnie.

Problem jest następujący: za każdym razem, gdy publikuję formularz, mam dziennik konsoli z odpowiedzią, która jest pełną stroną HTML, a nie prostą wiadomością.

Skrypt zaplecza:

    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' );

// Email verification callback
function verify_and_sanitize_email_form() {
    // Check referer
    check_ajax_referer( '9pU0Pk7T01', 'security' );

    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();
    }
    $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 'Email is not valid';
        wp_die();
    }

    if($sanitized_email !== $sanitized_email_confirmation) {
        echo 'Emails do not match';
        wp_die();
    }

    if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
        echo 'Fatal error with radio buttons';
        wp_die();
    }

    if(!isset($_COOKIE['rguroo_form_type'])) {
        echo 'Server error';
        wp_die();
    }

    // student email verification logic
    $form_type = $_COOKIE['rguroo_form_type'];
    if($form_type === 'student') {
        $trail = substr($sanitized_email, -4);
        if($trail !== '.edu') {
            echo 'Not a valid student email';
            wp_die();
        }
        // Other university specific logic here
    }
    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 frontendu:

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 = "Cannot contact server";
          }
      });
    return false;
  });
});

Formularz (używany w skrócie):

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="Purchase 12 months access" value="purchase" name="rguroo_desired_action" checked>Purchase 12 months access</input>
                <input type="radio" label="Renew account" name="rguroo_desired_action" value="renewal">Renew account</input>
                <input type="radio" label="Create trial account" name="rguroo_desired_action" value="trial">Create trial account</input>
                <p class="form-subtext">* indicates required field</p>
                <p>Email address*</p>
                <input type="text" name="rguroo_email" required>
                <p>Re-type email address*</p>
                <input type="text" name="rguroo_email_confirmation" required>
                <input type="hidden" name="action" value="email_verification_form">
                <input type="submit" value="Submit"> 
            </form>';
}

Rzeczy, które wiem: nie ma problemu z wysyłaniem postu przez jQuery (lub przynajmniej wysyłaniem żądania postu). Po przesłaniu jQuery wysyła post ze wszystkimi poprawnymi parametrami. Wiem też, że nie używam różnych nonces. Próbowałem umieścić error_logs() wokół funkcji wywołania zwrotnego, ale żaden z nich nigdy nie został wyświetlony w debug.log. To prowadzi mnie do przekonania, że ​​wywołanie zwrotne nigdy nie jest wywoływane, ale nie wiem dlaczego. Ponadto, nawet jeśli podam formularzowi test, który powinien zakończyć się niepowodzeniem, jQuery nadal odczytuje to jako sukces.

Warto przeczytać!  Pola niestandardowe a niestandardowe typy postów w witrynie portfolio

Zmarnowałem cały dzień na ten formularz i czuję się jak idiota. Czy ktoś, kto ma kilka komórek mózgowych więcej niż ja, może mi powiedzieć, gdzie robię błąd?

Bardzo dziękuję.


Źródło