Вопрос или проблема
Я пытаюсь передать переменную из формы выбора, но не могу заставить это работать – какой правильный способ сделать это?
Консоль сейчас выдает ошибку объекта: 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 на клиентской стороне до обработки данных на сервере – чтобы найти потенциальные ошибки.
Удачи в решении проблемы!