Intereting Posts
Пароль защищает один сайт в сети пытаясь использовать одно свойство функции в другой функции Как увеличить размер изображений в моем блоге? кнопка редактирования сообщения на передней панели Пользовательские типы сообщений, относящиеся к одному типу пользовательских сообщений? Сортировка по умолчанию в столбцах администратора с метаданной скрывает черновики сообщений с пустым значением даты Как установить правильную $ content_width, когда на одной странице есть две ширины содержимого? отображение персонализированного сообщения на отдельной странице Хранение данных в многомерном массиве из динамически созданного цикла foreach Как изменить .css-версию? Показывать виджет по-разному в зависимости от того, находится ли он на боковой панели или нижнем колонтитуле Нечетные /wp-admin/admin-ajax.php записи в Wassup Удалить тысячи рабочих мест cron Рефакторинг длинной if / else php-цепей Пользовательский url в wordpress

Не удается получить объект JSON в ответ на запрос ajax с помощью wp_ajax

У меня проблема с WordPress и ajax.

Это моя часть javascript (я немного ее обрезал):

var posts = $.ajax({ type: 'POST', url: ajaxurl, async: false, dataType: 'json', data: { action: 'myAjaxFunc' }, done: function(response) { return response; } }).responseText; $.each(posts, function() { $('#someSelect').append( $('<option</option>').text(this.name).val(this.id) ); }); 

Мой PHP-код выглядит следующим образом:

 function myAjaxFunc() { $posts = get_posts( array( 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC', 'post_type' => 'my-post-type', 'post_status' => array( 'publish', 'draft' ) ) ); $list = array(); foreach ( $posts as $post ) { $list[] = array( 'id' => $post->ID, 'name' => $post->post_title, 'link' => get_permalink( $post->ID ), ); } header("Content-type: application/json"); echo json_encode( $list ); die; } add_action( 'wp_ajax_nopriv_myAjaxFunc', 'myAjaxFunc' ); add_action( 'wp_ajax_myAjaxFunc', 'myAjaxFunc' ); 

Сценарий получает ответ ajax от admin-ajax. К сожалению, консоль выдает ошибку, когда она попадает в each утверждение в javascript … в нем говорится:

 "Uncaught TypeError: Cannot use 'in' operator to search for '4' in Array". 

Если я делаю console.log своих «сообщений» var, я получаю строку «Array». Независимо от того, как я передаю переменную $list в PHP, она всегда возвращает строку. Запрос возвращает сообщения в другом месте, поэтому он не пуст. Я пробовал без json_encode с объявлением заголовка и без него, используя wp_send_json() , поместив ob_clean() прежде чем ob_clean() массив, помещая массив в массив … Но он всегда попадает в ajax в виде Array строк и each не может циклически перебирать его ,

Это должно быть очень просто, и я не понимаю, почему он не работает. У меня нет других ошибок или предупреждений javascript или php, и все остальное работает нормально. Я называю это днем ​​и спать, публикуя это в стеке 🙂

Solutions Collecting From Web of "Не удается получить объект JSON в ответ на запрос ajax с помощью wp_ajax"

@ BODA82 ответ помог, но в итоге я понял, что должен был заменить responseText с помощью метода responseJSON в моем javascript-коде. В приведенном ниже примере я сохранял результаты ответа ajax в переменной. Я не знал, что существует специальный метод получения ответа в JSON. Таким образом, объект / массив с результатами get_posts() возвращается правильно, а не как строка:

 posts = $.ajax({ type: 'GET', url: ajaxurl, async: false, dataType: 'json', data: { action : 'getHotelsList' }, done: function(results) { // uhm, maybe I don't even need this? JSON.parse(results); return results; }, fail: function( jqXHR, textStatus, errorThrown ) { console.log( 'Could not get posts, server response: ' + textStatus + ': ' + errorThrown ); } }).responseJSON; // <-- this instead of .responseText 

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

Почти с вашей функцией PHP. Не нужно устанавливать заголовок. (Edit: Также, если get_posts() фактически возвращает результаты.)

 function myAjaxFunc() { $posts = get_posts( array( 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC', 'post_type' => 'my-post-type', 'post_status' => array( 'publish', 'draft' ) ) ); $list = array(); foreach ( $posts as $post ) { $list[] = array( 'id' => $post->ID, 'name' => $post->post_title, 'link' => get_permalink( $post->ID ), ); } echo json_encode( $list ); die; } add_action( 'wp_ajax_nopriv_myAjaxFunc', 'myAjaxFunc' ); add_action( 'wp_ajax_myAjaxFunc', 'myAjaxFunc' ); 

И ваш Javascript:

 $.ajax({ url: "<?php bloginfo('url'); ?>/wp-admin/admin-ajax.php", type: "POST", data: "action=myAjaxFunc", success: function(results) { var posts = JSON.parse(results); console.log(results); $.each(posts, function() { $('#someSelect').append( $('<option></option>').text(this.name).val(this.id) ); }); }, error: function() { console.log('Cannot retrieve data.'); } }); 

Существует выход, использовать полный, а не успех или сделать

 posts = $.ajax({ type: 'GET', url: ajaxurl, async: false, dataType: 'json', data: { action : 'getHotelsList' }, complete: function(results) { 

и попытайтесь удалить async:false если проблема не устранена