Передача значения из формы выбора с помощью Ajax не работает

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

Я пытаюсь передать переменную из формы выбора, но не могу заставить это работать – какой правильный способ сделать это?

Консоль сейчас выдает ошибку объекта: statusText: "parsererror"

Обновление:

Изменил json_encode и обновил скрипт. Теперь получаю правильное значение, но условное выражение if/else не срабатывает.

Форма

<select id="dropdown_shop_order_language" name="wcml_shop_order_language">                  
<option value="nl">Нидерландский</option>
<option value="en" selected="selected">Английский</option>
<option value="de">Немецкий</option>
</select>

Javascript

jQuery(document).ready(function($) {
 
   jQuery('#dropdown_shop_order_language').on('change', function(){

      $.ajax({
        dataType: 'json', 
        type: "POST",
        url: ajaxurl,
          data: {
              'action':'my_action',            
               'dropdown_shop_order_language': $('#dropdown_shop_order_language').val() 
 
          },
          success:function(data) {      
            console.log(data);
          },
          error: function(errorThrown){
              console.log(errorThrown);
          }
      });
    });
});

PHP

function my_enque_action( $hook ) {
global $post;
     $postid = $post->ID; 
    if ( $hook == 'post-new.php' || $hook == 'post.php' ) {    
        
        if( get_post_type( $postid ) === 'shop_order' ) {  
         wp_enqueue_script( 'lang_script', get_template_directory_uri() . '/assets/javascripts/language.js', array( 'jquery' ), '1.0.0', true );

        }
    }
}
add_action( 'admin_enqueue_scripts', 'my_enque_action', 10, 1 );

function my_action( ) {
 $dropdown_shop_order_language = $_POST['dropdown_shop_order_language'];
        
        if ( $dropdown_shop_order_language == 'nl' ) {

        } elseif ( $dropdown_shop_order_language == 'de' ) {
    
        } elseif ( $dropdown_shop_order_language == 'en' ) {
        
        }    
 
 echo json_encode($dropdown_shop_order_language);
   wp_die();
}
add_action('wp_ajax_my_action', 'my_action');
add_action('wp_ajax_nopriv_my_action', 'my_action');

Похоже, вы пропустили ajax действия, их два: одно для авторизованных пользователей и одно для не авторизованных пользователей.
Согласно вашему действию, вам нужно добавить следующие действия.

// это для авторизованных пользователей
add_action('wp_ajax_my_action', 'my_action');

// это для не авторизованных пользователей
add_action('wp_ajax_nopriv_my_action', 'my_action');

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

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

1. Проверка HTML-формы

Ваш исходный HTML-код для выбора языка выглядит правильно:

<select id="dropdown_shop_order_language" name="wcml_shop_order_language">                  
    <option value="nl">Nederlands</option>
    <option value="en" selected="selected">Engels</option>
    <option value="de">Duits</option>
</select>

Убедитесь, что этот код загружается корректно и элемент выбора доступен на странице, когда происходит событие change.

2. JavaScript/AJAX-код

Ваш JavaScript-код для отправки AJAX-запроса также выглядит корректным. Однако убедитесь, что вы используете ajaxurl, который должен быть определен верно. Обычно он доступен в WordPress с помощью следующего кода:

<script type="text/javascript">
    var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>

Убедитесь, что этот скрипт подключен до вашего AJAX-кода.

3. Обработка AJAX-запроса в PHP

Ваш PHP-код для обработки запроса выглядит корректно. Однако не забудьте проверить, что вы правильно обрабатываете входящий POST-запрос в вашей функции my_action. Вы уже выполнили проверку на различные значения $_POST['dropdown_shop_order_language'], но вы ничего не делаете внутри ваших условных операторов:

function my_action() {
    $dropdown_shop_order_language = $_POST['dropdown_shop_order_language'];

    if ($dropdown_shop_order_language == 'nl') {
        // Обработка для голландского
    } elseif ($dropdown_shop_order_language == 'de') {
        // Обработка для немецкого
    } elseif ($dropdown_shop_order_language == 'en') {
        // Обработка для английского
    }  

    echo json_encode($dropdown_shop_order_language);
    wp_die();
}

В каждой ветке if добавьте хотя бы одну строку кода для обработки или логирования, чтобы убедиться, что код действительно запускается.

4. Обработка ошибок

Ошибка parsererror, которую вы видите в консоли, может также означать, что ответ сервера не в формате JSON. Проверьте, что возвращаемый вами ответ корректно форматирован. Если, например, между echo json_encode(...); и wp_die(); возникает какая-либо ошибка, это может привести к проблемам с форматом ответа.

5. Убедитесь, что AJAX-запросы являются правильными

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

// для вошедших пользователей
add_action('wp_ajax_my_action', 'my_action');

// для не вошедших пользователей
add_action('wp_ajax_nopriv_my_action', 'my_action');

Регистрация этих действий критична для правильной работы AJAX.

6. Проверка консоли разработчика

Используйте инструменты разработчика в вашем браузере (обычно доступны по F12) для проверки ответов на AJAX-запросы. Перейдите на вкладку Network, выберите ваш запрос и посмотрите, что именно возвращается от сервера. Это поможет вам идентифицировать возможные ошибки на этапе ответа.

Заключение

После выполнения вышеуказанных шагов у вас должен быть рабочий AJAX-запрос, который корректно отправляет значение выбранного языка и получает ответ от сервера. Если проблема все еще сохраняется, проверяйте каждый шаг в порядке – от XMLHttpRequest на клиентской стороне до обработки данных на сервере – чтобы найти потенциальные ошибки.

Удачи в решении проблемы!

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

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