Ajax-запрос возвращает полную HTML-страницу в качестве ответа

Вопрос или проблема

Я знаю, что этот вопрос часто задавался здесь, но ни одно из найденных мной решений не кажется работающим для меня.

Проблема заключается в следующем: всякий раз, когда я отправляю форму, в консоли появляется лог с ответом, который является полной HTML-страницей, а не простым сообщением.

Скрипт на стороне сервера:

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

// Коллбек для верификации по электронной почте
function verify_and_sanitize_email_form() {
    // Проверка реферера
    check_ajax_referer( '9pU0Pk7T01', 'security' );

    if(empty($_POST) || !isset($_POST['rguroo_email']) || !isset($_POST['rguroo_email_confirmation']) || !isset($_POST['rguroo_desired_action'])) {
        echo 'Одно или несколько полей пусты';
        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 'Электронная почта недействительна';
        wp_die();
    }

    if($sanitized_email !== $sanitized_email_confirmation) {
        echo 'Электронные адреса не совпадают';
        wp_die();
    }

    if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
        echo 'Серьезная ошибка с радиокнопками';
        wp_die();
    }

    if(!isset($_COOKIE['rguroo_form_type'])) {
        echo 'Ошибка сервера';
        wp_die();
    }

    // Логика верификации электронной почты студентов
    $form_type = $_COOKIE['rguroo_form_type'];
    if($form_type === 'student') {
        $trail = substr($sanitized_email, -4);
        if($trail !== '.edu') {
            echo 'Недействительный студенческий адрес электронной почты';
            wp_die();
        }
        // Здесь может быть другая специфическая логика университета
    }
    setcookie('rguroo_form_action',$desired_action, 14 * DAY_IN_SECONDS);
    setcookie('rguroo_form_email', $sanitized_email, 14 * DAY_IN_SECONDS);
    echo "успех";
    wp_die();
}

Скрипт на стороне клиента:

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 !== 'успех') {
                jQuery('.error').innerHTML = response;
              } else {
                location.reload();
              }
          },
          fail : function( err ) {
              jQuery('.error').innerHTML = "Не удается установить связь с сервером";
          }
      });
    return false;
  });
});

Форма (используемая в шорткоде):

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="Купить доступ на 12 месяцев" value="purchase" name="rguroo_desired_action" checked>Купить доступ на 12 месяцев</input>
                <input type="radio" label="Продлить аккаунт" name="rguroo_desired_action" value="renewal">Продлить аккаунт</input>
                <input type="radio" label="Создать пробный аккаунт" name="rguroo_desired_action" value="trial">Создать пробный аккаунт</input>
                <p class="form-subtext">* обязательное поле</p>
                <p>Электронный адрес*</p>
                <input type="text" name="rguroo_email" required>
                <p>Повторите электронный адрес*</p>
                <input type="text" name="rguroo_email_confirmation" required>
                <input type="hidden" name="action" value="email_verification_form">
                <input type="submit" value="Отправить"> 
            </form>';
}

Что я знаю: проблемы с отправкой поста jQuery (или по крайней мере с отправкой POST-запроса) нет. При отправке jQuery отправляет пост со всеми правильными параметрами. Я также знаю, что я не использую разные nonce. Я пробовал вставлять error_logs() в разных местах коллбек-функции, но ни одно из них никогда не отображалось в debug.log. Это приводит меня к мысли, что коллбек никогда не вызывается, но я не знаю, почему. Также, даже если я даю форме тест, который должен завершиться неудачей, jQuery все равно воспринимает это как успех.

Я потратил весь день на эту форму и чувствую себя идиотом. Мог бы кто-то с немного большим количеством мозгов, чем у меня, сказать мне, где я неправ?

Большое спасибо.

Вызов этой функции дополняет функцию die() PHP. Разница в том, что HTML будет отображаться пользователю в случае типичного веб-запроса

Взято отсюда здесь

Вы пробовали использовать die() вместо wp_die() или exit()?

вам нужно указать действие в вашем AJAX-запросе, чтобы вызвать функцию PHP

url : ajax_info.ajax_url,
type : 'post',
data : form_data,
action: email_output_verification,

Эта проблема возникает, когда имя PHP-файла в AJAX-вызове недействительно.

Например:

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

Правильный способ:

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

Некоторые проблемы в вашем коде, такие как действие AJAX и форма, использующая шорткод

Измените свой код и протестируйте

Код ниже

functions.php

 function enqueue_scripts() {
        // Подключите CSS
        //wp_enqueue_style('wp-news-search', plugins_url('/css/wp-news-search.css', __FILE__));
        // Подключите и локализуйте 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' );

// Коллбек для верификации по электронной почте
function verify_and_sanitize_email_form() {
    // Проверка реферера
   check_ajax_referer( '9pU0Pk7T01', 'security' );


  //  echo "string";
   parse_str($_POST['data'], $data);
    

    if(empty($_POST) || !isset($data['rguroo_email']) || !isset($data['rguroo_email_confirmation']) || !isset($data['rguroo_desired_action'])) {
        echo 'Одно или несколько полей пусты';
        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 'Электронная почта недействительна';
        wp_die();
    }

    if($sanitized_email !== $sanitized_email_confirmation) {
        echo 'Электронные адреса не совпадают';
        wp_die();
    }

    if($desired_action !== 'purchase' || $desired_action !== 'renewal' || $desired_action !== 'trial') {
        echo 'Серьезная ошибка с радиокнопками';
        wp_die();
    }

    if(!isset($_COOKIE['rguroo_form_type'])) {
        echo 'Ошибка сервера';
        wp_die();
    }

    // Логика верификации электронной почты студентов
    $form_type = $_COOKIE['rguroo_form_type'];
    if($form_type === 'student') {
        $trail = substr($sanitized_email, -4);
        if($trail !== '.edu') {
            echo 'Недействительный студенческий адрес электронной почты';
            wp_die();
        }
        // Здесь может быть другая специфическая логика университета
    }
    setcookie('rguroo_form_action',$desired_action, 14 * DAY_IN_SECONDS);
    setcookie('rguroo_form_email', $sanitized_email, 14 * DAY_IN_SECONDS);
    echo "успех";
    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="Купить доступ на 12 месяцев" value="purchase" name="rguroo_desired_action" checked>Купить доступ на 12 месяцев</input>
            <input type="radio" label="Продлить аккаунт" name="rguroo_desired_action" value="renewal">Продлить аккаунт</input>
            <input type="radio" label="Создать пробный аккаунт" name="rguroo_desired_action" value="trial">Создать пробный аккаунт</input>
            <p class="form-subtext">* обязательное поле</p>
            <p>Электронный адрес*</p>
            <input type="text" name="rguroo_email" required>
            <p>Повторите электронный адрес*</p>
            <input type="text" name="rguroo_email_confirmation" required>
            <input type="hidden" name="action" value="email_verification_form">
            <input type="submit" value="Отправить"> 
        </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 !== 'успех') {
                jQuery('p.error').html(response);
              } else {
                location.reload();
              }
          },
          fail : function( err ) {
              jQuery('.error').innerHTML = "Не удается установить связь с сервером";
          }
      });
    return false;
  });
});

Это может сработать. Найдите свой div по имени класса из ответа и получите его innerHTML.

success : function( response ) {
              var error = $(response).find('.error-div')[0].innerHTML;
              if(response !== 'успех') {
                jQuery('.error').innerHTML = error;
              }

Ответ или решение

Проблема, с которой вы столкнулись, заключается в получении полного HTML-документа в ответ на AJAX-запрос вместо ожидаемого простого сообщения. Давайте рассмотрим возможные причины этой проблемы и предложим решения, основываясь на вашем коде и описании.

1. Проверка правильности JavaScript запроса

Первым делом, убедитесь, что AJAX-запрос формируется корректно. При использовании jQuery.ajax, необходимо убедиться, что все параметры отправляются должным образом, включая действие и защитный токен запроса. В вашем коде вы передаете action в объекте данных:

data: {
    action: 'email_verification_form',
    data: form_data,
    security: ajax_info.security
},

2. Правильное использование AJAX хука

Убедитесь, что вы правильно регистрируете AJAX-действия в вашем коде. Это делает с помощью add_action:

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

Убедитесь, что название действия (email_verification_form) совпадает как на стороне клиента, так и на стороне сервера.

3. Проверка и отладка серверной части

Ваша серверная функция verify_and_sanitize_email_form выполняет множество проверок, и в случае ошибки вы возвращаете ответ между wp_die(). Убедитесь, что функция корректно обрабатывает все возможные ошибки и данные:

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();
}

Также стоит убедиться, что все данные, которые оцениваются, действительно присутствуют в массиве $_POST.

4. Возможная проблема с редиректами

Если в вашем коде возникает ошибка или происходит редирект во время обработки запроса (например, если не проходится проверка безопасности или неверный ввод), это может привести к возврату полного HTML-документа. Убедитесь, что:

  • Страница, на которую происходит запрос, настроена на обработку AJAX.
  • В вашем коде нет условий, которые могут вызывать перенаправление.

5. Использование wp_die()

wp_die() является мощным инструментом и используется для завершения скрипта с фатальной ошибкой. Убедитесь, что, когда вы вызываете этот метод, вы не возвращаете ничего лишнего (например, HTML-код). Если вы видите, что функция verify_and_sanitize_email_form никогда не вызывается, это может объяснять, почему вы видите полный HTML в ответ.

Рекомендации и оптимизация

  • Используйте инструменты разработчика браузера (например, вкладка "Network") для проверки ответа на AJAX-запрос. Это поможет понять, какой именно ответ приходит от сервера.
  • Убедитесь, что все пути к скриптам, стилам, тегам и переменным определены правильно.
  • Добавьте дополнительные журналы ошибок (error_log()) для отслеживания выполнения функции.

Заключение

Если после всех этих проверок проблема не исчезает, попробуйте упростить ваш код до минимального рабочего примера. Это поможет изолировать проблему и найти точное место, где все идет не так. И всегда помните, что тестирование ошибок в таком сложном окружении, как WordPress, требует детальной проверки на каждом этапе выполнения кода.

Оцените материал
Добавить комментарий

Капча загружается...