Основной вопрос о передаче переменных в AJAX в Wordpress

Я следую примеру на AJAX в Плагины на сайте Wordpress. Это очень простой пример, и я пытаюсь изменить пример так, как я намереваюсь.

Я пытаюсь достичь чего-то простого:

  • Когда выбран новый параметр в выпадающий список select /option, обнаружение выбранного значения
  • Передача выбранного значения в функцию PHP через AJAX

Однако выбранное значение не передается через AJAX .В результате я получаю: что угодно = 1234 | what2 =

Как правильно передать свою переменную в AJAX?

Мой код:

//Select/Option Dropdown<select id="_type" name="_type">  <option value="AAA"> AAA </option>  <option value="BBB"> BBB </option>  <option value="CCC"> CCC </option></select>//Detect change and call and AJAX<script type="text/javascript">jQuery('#_type'.change(function($) {  var val = jQuery('#_type').val(); <-- Here I am properly getting val as it changes.  console.log( '_type is changed to ' + val );  var data = {    'action': 'my_action',    'type': 'post',    'whatever': 1234,    'whatever2': val <-- But here val becomes empty.    };  jQuery.post(ajaxurl, data, function(response) {    alert( 'Got this from the server: ' + response );  });}).change();</script>//PHP function 'my_action'add_action( 'wp_ajax_my_action', 'my_action' );function my_action() {  global $wpdb;  $whatever = $_POST['whatever'];  $whatever2 = $_POST['whatever2'];  echo 'whatever = ' . $whatever . ' | whatever2 = ' . $whatever2;  wp_die();}

Ответы и комментарии:

код кажется устаревшим, но хорошо. Используйте инструменты мониторинга сети в инструментах разработчика вашего браузера, чтобы увидеть, что именно отправляется и получается.
Создан 07-04-2017 11:29 Mark Kaplun

Я бы порекомендовал вместо этого использовать WP REST API вместо более старой системы AJAX WP Admin, она намного более понятна и, как следствие, с ней легче работать, и обрабатывает много вещей для вас, таких как уровни доступа и аутентификация, вещи, которые трудно получить права с Admin AJAX
Создан 07-04-2017 12:10 Tom J Nowell♦

Мне действительно нравится этот подход Rest API. WP движется в этом направлении, мы тоже должны. +1 за другой подход.
Создан 07-04-2017 04:00 Fayaz

Я последовал вашему примеру, но он выдает ошибку 404 (не найдено), хотя я скопировал и вставил ваш код. Я проверил страницу кодекса Wordpress для этой пользовательской конечной точки, но я не вижу ничего плохого в вашем коде. Тем не менее ... я получаю 404 ... возможно, потому что я на мультисайте?
Создан 08-04-2017 12:43 Dongsan

После часа разочарования я обнаружил, что это должен быть jQuery.post ('/ blog_name / dongsan / v1 / what', так как я нахожусь в многосайтовой среде. Теперь мне нужно выяснить, как доставить это blog_name в jQuery.post .. «.
Создан 08-04-2017 12:48 Dongsan

@ Донгсан, на самом деле это хороший вопрос! Вы должны задать его как отдельный вопрос, кажется, что он привлек бы к себе много внимания.
Создан 08-04-2017 01:50 Tom J Nowell♦

Я сделал URL-адрес абсолютным, поэтому очевидно, что его нужно изменить, а не использовать /, что должно предотвратить появление других проблем.
Создан 08-04-2017 01:40 Tom J Nowell♦

Я добавил 'type': 'post', и он все еще не работает. Под «безопасностью» что вы имеете в виду? Код AJAX почти такой же, как пример в Wordpress AJAX на странице плагинов.
Создан 07-04-2017 11:52 Dongsan

Безопасность необходима из-за функции check_ajax_referer. check_ajax_referer. Это не что-то, что исправит вашу текущую проблему, но это должно обеспечить безопасность вашего вызова ajax.
Создан 07-04-2017 11:34 kiarashi

console.log (val) внутри 'success' правильно отображает значение. Очень запутанно.
Создан 07-04-2017 11:58 Dongsan

ах, я вижу проблему; это связано с my_action. Подожди немного, пока я полностью не изменю твой код.
Создан 07-04-2017 11:46 kiarashi

Черт ... позор мне. Я был совершенно неправ. Переменная 'val' имеет значения ТОЛЬКО ПРИ ИЗМЕНЕНИИ значения select / option. Я смотрел только на первое предупреждение, которое, конечно, имеет значение NULL. Извините, и спасибо.
Создан 07-04-2017 11:55 Dongsan

Ответ прост: не беспокойтесь об API администратора AJAX, используйте API REST!
Расскажите WordPress о своей конечной точке:
add_action ('rest_api_init', function () {// зарегистрировать dongsan / v1 / что угодно
        register_rest_route ('dongsan / v1', '/ what / /, массив (
                'method' => 'POST', // использовать POST для вызова
                'callback' => 'dongsan_whwhat' // вызвать эту функцию
        ));
});

Теперь у нас есть конечная точка в example.com/wp-json/dongsan/v1/wh независимо!
Мы сказали WordPress запускать dongsan_wh независимо от того, когда он вызывается, поэтому давайте сделаем это:
function dongsan_whwhat ( WP_REST_Request $ request) {
    $ name = $ request ['name'];
    вернуть 'привет'. $ name;
}

Обратите внимание, что мы использовали $ request ['name'], чтобы получить параметр имени!
Итак, у нас есть URL:
example.com/wp-json/dongsan/v1/whatever

И мы можем отправить POST-запрос с именем и получить обратно JSON, который говорит Hello 'name'! Так как мы это сделаем?
Проще говоря, это стандартный пост-запрос jQuery:
jQuery.post (
    'Https://example.com/wp-json/dongsan/v1/whatever',
    {'name': 'Dongsan'}
) .done (функция (данные) {
    Console.log (данные); // скорее всего "Hello Dongsan"
});

Дальнейшее чтение:

https://tomjn.com/2017/01/23/writing-wp-rest-api-endpoint-2-minutes/
https://developer.wordpress.org/rest-api/
Создан 08-04-2017 01:10

Только что проверил ваш код, и он, кажется, работает нормально. Просто добавьте скобку в функцию изменения jQuery («#_тип»). Change (function ($)
Кроме того, вам нужно добавить действие no_priv, если вы используете ajax на веб-интерфейсе
add_action ('wp_ajax_nopriv_my_action', 'my_action');

Проверьте и дайте мне знать, если это работает для вас.
Создан 07-04-2017 12:56 MagniGeeks Technologies32117

Попробуйте добавить тип: 'post', inside data = {...}
Кроме того, мне не хватает «безопасности» внутри вашей функции ajax.
Не могли бы вы добавить это и показать нам результаты:
.success (функция (результаты) {
                   console.log (val);
                })
Создан 07-04-2017 11:20