Автозаполнение или автоматическое предложение из списка заголовков сообщений


13

Я хочу иметь функцию автозаполнения или автоматического предложения в форме (поиска):

Когда пользователь начинает печатать, он предлагает заголовки сообщений, которые имеют соответствующий текст.

Я также хотел бы, чтобы он отображал некоторые метаданные (число), которые я сохранил, связанные с каждым пользовательским сообщением. Пример:

Если я наберу «А», он предложит «Яблоки (13), Аардваркс (51), Астронавты (21)» и т. Д.


Как называется метаполе? Пожалуйста, добавьте код, который показывает , как именно вы добавили мета-поле. Благодарю.
Кайзер

Я сделал предположение, что мета-поле - это специально добавленное мета-поле поста (добавлением мета-блока), или пользовательская переменная поста, доступ к которой можно получить с помощью get_post_meta (iirc)
Барри Карлион,

Я на самом деле еще не добавил мета-поле.
marctain

Ответы:


17

Да, это возможно.

Вы можете использовать jQuery Auto Suggest, который включен в WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

При этом вы можете написать форму, которая выполняет поиск Ajax в обработчике URL Ajax. Который вы можете добавить_действие на. http://codex.wordpress.org/AJAX_in_Plugins

Таким образом, вы можете искать ajax, а затем на стороне действия вы можете просто выполнить get_posts для соответствия заголовкам или необработанный sql Query. И вернуть то, что нужно.

Это должно помочь, если я получу время в ближайшее время, я мог бы написать полное решение кода. Но большая часть этого - целый плагин, чтобы помочь поиску.

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

2012-11-21 Редактировать: обновлена ​​опечатка в примере кода.

add_action('wp_enqueue_scripts', 'se_wp_enqueue_scripts');
function se_wp_enqueue_scripts() {
    wp_enqueue_script('suggest');
}

add_action('wp_head', 'se_wp_head');
function se_wp_head() {
?>
<script type="text/javascript">
    var se_ajax_url = '<?php echo admin_url('admin-ajax.php'); ?>';

    jQuery(document).ready(function() {
        jQuery('#se_search_element_id').suggest(se_ajax_url + '?action=se_lookup');
    });
</script>
<?php
}

add_action('wp_ajax_se_lookup', 'se_lookup');
add_action('wp_ajax_nopriv_se_lookup', 'se_lookup');

function se_lookup() {
    global $wpdb;

    $search = like_escape($_REQUEST['q']);

    $query = 'SELECT ID,post_title FROM ' . $wpdb->posts . '
        WHERE post_title LIKE \'' . $search . '%\'
        AND post_type = \'post_type_name\'
        AND post_status = \'publish\'
        ORDER BY post_title ASC';
    foreach ($wpdb->get_results($query) as $row) {
        $post_title = $row->post_title;
        $id = $row->ID;

        $meta = get_post_meta($id, 'YOUR_METANAME', TRUE);

        echo $post_title . ' (' . $meta . ')' . "\n";
    }
    die();
}

Вау, спасибо, Барри! Я приведу это, это идет в functions.php, да? Я изменю необходимые детали и посмотрю, что это даст
marctain

2
В теории да, в functions.php. Я бы вставил его в плагин, чтобы он не мешал. Если он идет прямо в functions.php, то можно провести некоторую оптимизацию, поэтому часть этого кода можно применить к функциям, которые уже существуют в functions.php (конечно, зависит от темы)
Барри Карлайон

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

Обновлено, чтобы включить like_escape. Я не использую% в начале, так как он хочет искать, где заголовки сообщений начинаются с первой введенной буквы. Не глобальный матч. Мой рабочий код с $ _REQUEST ['q'] без опций, примененных к предложению jQuery. Q эмулирует то, что используют поисковые системы.
Барри Карлион

@BarryCarlyon Пожалуйста, не редактируйте каждую мелочь. Если вы достигнете 10 изменений, оно автоматически преобразуется в «сообщество вики», и вы потеряете все точки повторения. И нам нужно больше пользователей, которые добавят хорошие ответы и получат мин. репутации для выполнения таких задач, как редактирование, добавление вики и т. д. О, и exit;всегда быстрее, чем die();:)
kaiser
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.