Intereting Posts
Как зеркалировать базу данных WordPress с удаленного сервера на локальный сервер admin-ajax.php vs Пользовательский шаблон страницы для запросов Ajax Как перенаправить логин Пользователь с Mapped Domiain Primary blog Url к оригинальному URL-адресу субсайта проблема с запросом на выбор следующего и предыдущего сообщений Разница в человеческом времени в месяцах вместо дней. Как? Крючок на генераторе Повторяющиеся постоянные / конечные позиции. (Ссылка временно) доступ к родительским переменным в дочерней конструкции без выполнения действий в родительском изменить размер фона / шрифта и запомнить Можно ли скопировать неупорядоченный список внутри короткого кода? wp_get_attachment_url (get_post_thumbnail_id ($ post-> ID)); Получение большого пальца от неправильной петли Программирование добавления пользовательской почты Приоритет для категорий, тегов, таксономий, сообщений, страниц и пользовательских сообщений с одинаковым URL-адресом Многие для многих таксономий или переписывают правила? Правила перезаписи HTTPS в HTTP не работают должным образом

Автозаполнение jQuery UI, показывающее все результаты

Я создал окно поиска автозаполнения для категорий WordPress (на самом деле это обычная таксономия), который отлично работает (т. Е. Отображает категории при вводе). Однако, когда вводится 1 ключ, он отображает все результаты, независимо от того, соответствует ли эта строка любой из категорий.

Вот мой PHP-код (autocomplete.php, в корне моей директории темы):

<?php include_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php' ); // I know the traditional way to do it is loading admin_ajax but I read this was exactly the same and didn't increase the overhead to the server if (isset($_GET['term'])) { // I suspect the problem is something to with this $tradeList = get_terms('trade'); $tradeNames = Array(); foreach ($tradeList as $trade) { $tradeName = $trade->name; array_push($tradeNames, $tradeName); } echo json_encode($tradeNames); } ?> 

и мой код Javascript:

 $(document).ready(function() { $(".main-search-field").autocomplete({ source: "/wp-content/themes/local_directory/autocomplete.php", minLength: 1 }); }); 

и, наконец, HTML:

 <input type="text" class="main-search-field" name="search" id="search"> 

Я понимаю, что это может быть плохо закодировано, если вы не можете повторить это. Но мне действительно нужно знать, как сделать предложения автозаполнения релевантными для строки, введенной в поле поиска.

Спасибо за любую помощь 🙂

Solutions Collecting From Web of "Автозаполнение jQuery UI, показывающее все результаты"

Вы получаете все условия, потому что вы запрашиваете все условия, по сути, линию

 $tradeList = get_terms('trade'); 

просто получите все условия, игнорируя строку запроса «term», переданную в файл.

Если вы хотите получить все термины «filterd», вы должны использовать строку в запросе, например:

 include_once( '../../../wp-load.php' ); // adjust the path, of course // or dirname( dirname( dirname( __FILE__ ) ) ) . '/wp-load.php'; $term = filter_input( INPUT_GET, 'term', FILTER_SANITIZE_STRING ); if ( empty( $term ) ) exit(); $trades = get_terms( 'trade', array( 'name__like' => $term, 'fields' => 'names' ) ); if ( ! empty( $trades ) && is_array( $trades ) ) { echo json_encode( $trades ); } 

Тем не менее, обратите внимание, что, используя настройки в OP, каждый раз, когда пользователь вводит символ в поле ввода, на ваш сервер есть запрос ajax, поэтому, если пользователь вводит 4 буквы, прежде чем сделать выбор, у вас будет еще 4 дополнительных HTTP-запроса , так что код легко становится серверным убийцей.

Итак, если вы хотите использовать этот подход, по крайней мере используйте более minLength аргумент minLength .

Альтернативой является получение всех условий, вывод их в виде массива javascript и возможность сценария сделать фильтрацию, например:

 $(document).ready(function() { var trades = <?php $trades = get_terms( 'trade', array( 'fields' => 'names' ) ); echo '["' . implode( '","', $trades ) . '"]'; ?>; $(".main-search-field").autocomplete({ source: trades, minLength: 1 }); }); 

Для этого нет дополнительного HTTP-запроса, нет необходимости в файле autocomplete.php и если у вас нет тысяч условий торговли, этот подход, вероятно, лучше.

Заметки

В первом подходе грубое включение wp-load.php является плохой практикой, я знаю, что вы делаете это, чтобы «не нагрузить сервер», но плохая новость заключается в том, что накладные расходы для сервера не уменьшаются так много: вы загрузите всю среду WordPress, все плагины и тему. Кроме того, имейте в виду, что это делает ваш код непригодным для совместного использования. Если код предназначен только вам, и вы действительно хотите использовать этот подход, SHORTINIT константу SHORTINIT и ее использование (запустите здесь ) и загрузите wp-load.php путь к местоположению (как и я), потому что $_SERVER['DOCUMENT_ROOT'] не является доступным, это может быть не ожидаемое значение в зависимости от того, как настроен сервер.

Второй подход, который я предложил, избавляет вас от проблемы wp-load.php , а также сохраняет ваш сервер из большого количества запросов, но этот PHP-код, эхом в javascript, является чем-то действительно плохим, я использовал только для простоты в этот ответ. Вы должны поместить свой javascript-код в отдельный файл js и передать ему термины, используя wp_localize_script .