Я склонен сделать много исследований, прежде чем размещать здесь. Однако на этот раз я не вижу причин, по которым следующий код не будет работать должным образом.
У меня есть тема Wordpress, где я реализую следующий код:
jQuery(document).ready(function() {
jQuery( "#title" ).autocomplete({
/* source : JSON.parse('[{"label":"HAPPY","value":"HAPPY"},{"label":"HAPPY BIRTHDAY DETECTIVE","value":"HAPPY BIRTHDAY DETECTIVE"},{"label":"HAPPY BIRTHDAY HOLLYWOOD","value":"HAPPY BIRTHDAY HOLLYWOOD"},{"label":"HAPPY BIRTHDAY TO ME","value":"HAPPY BIRTHDAY TO ME"},{"label":"HAPPY DAYS","value":"HAPPY DAYS"},{"label":"HAPPY DAYS ","value":"HAPPY DAYS "},{"label":"HAPPY DAYS ","value":"HAPPY DAYS "},{"label":"HAPPY DAYS ","value":"HAPPY DAYS "},{"label":"HAPPY END","value":"HAPPY END"},{"label":"HAPPY ENDING","value":"HAPPY ENDING"},{"label":"HAPPY EVER AFTERS","value":"HAPPY EVER AFTERS"},{"label":"HAPPY EVER AFTERS","value":"HAPPY EVER AFTERS"},{"label":"HAPPY FAMILY","value":"HAPPY FAMILY"},{"label":"HAPPY FAMILY","value":"HAPPY FAMILY"},{"label":"HAPPY FAMILY","value":"HAPPY FAMILY"},{"label":"HAPPY GILMOUR","value":"HAPPY GILMOUR"},{"label":"HAPPY HOUR","value":"HAPPY HOUR"},{"label":"HAPPY HOUR","value":"HAPPY HOUR"},{"label":"HAPPY MAGIC","value":"HAPPY MAGIC"},{"label":"HAPPY TANK YOU MORE PLEASE","value":"HAPPY TANK YOU MORE PLEASE"},{"label":"HAPPY TANK YOU MORE PLEASE","value":"HAPPY TANK YOU MORE PLEASE"},{"label":"HAPPY TANK YOU MORE PLEASE","value":"HAPPY TANK YOU MORE PLEASE"},{"label":"HAPPY TANK YOU MORE PLEASE","value":"HAPPY TANK YOU MORE PLEASE"},{"label":"HAPPY TOGETHER","value":"HAPPY TOGETHER"},{"label":"HAPPY TOGETHER","value":"HAPPY TOGETHER"}]'), */
minChars: 3,
source: function(request,response) {
jQuery.ajax({
type: 'POST',
dataType: 'json',
url: '/wordpress/wp-admin/admin-ajax.php',
data: 'action=get_listing_names&name='+jQuery("#title").val(),
success: function (data) {
console.log(data);
},
error: function(e) {
console.log(e);
},
});
}
});
});
В файле functions.php темы, после того, как я зарегистрировал правильную функцию, я написал что-то вроде этого:
function ajax_listings() {
global $wpdb; //get access to the WordPress database object variable
$return_arr = array();
//get names of all businesses
$q = $wpdb->esc_like(stripslashes($_POST['name'])).'%'; //escape for use in LIKE statement
$mydb = new wpdb('xxx','xxx','xxxx','xxxx');
$rows = $mydb->get_results("select id,title from table1 where title like '".$q."%' order by title asc");
foreach( $rows as $row) {
$row_array['label'] = $row->title;
$row_array['value'] = $row->title;
array_push($return_arr,$row_array);
}
echo json_encode($return_arr);
die();
}
Все хорошо. Я вижу, что в Chrome я получаю как эхо PHP (на вкладке предварительного просмотра этого вызова Ajax), так и данные в случае успешного вызова Ajax. Данные правильно закодированы в JSON, как я это проверил, просмотрев цвета в консоли, и с помощью этого ответа Как проверить, является ли строка допустимой строкой JSON в JavaScript, без использования Try / Catch в функции обратного вызова success .
Однако результаты просто не отображаются. Самое смешное, что я скопировал и вставил полученную из PHP строку (временно исключив json_encode) и жестко запрограммировал ее (вы можете увидеть набор данных в качестве источника комментариев), и все работает.
Итак, я не знаю, почему результаты не отображаются, если набор данных отправляется из PHP, но они есть, если я копирую и вставляю тот же набор данных (в виде строки) и анализирую как JSON в Javascript.
Один из обходных путей может заключаться в том, чтобы попросить PHP вернуть строку, а затем проанализировать ее с помощью Javascript, но я понятия не имею, как справиться с этой ситуацией, поскольку автозаполнение, по-видимому, не предоставляет такой возможности.
Спасибо!
Fabio