Как создать живой поиск автозаполнения?

22

В настоящее время я пытаюсь создать функцию поиска wordpress, которая показывает результаты в реальном времени под строкой поиска. На веб-сайте Всемирного банка есть пример (скриншоты ниже). Я не ищу автозаполнения, как вы могли бы найти на Google.com, который заканчивает вводимые вами слова, скорее я хочу, чтобы он находил реальные сообщения на сайте.

Я попытался провести скраб через Wordpress Ответы и другие подобные ресурсы, но столкнулся только с реализацией поиска по типу Google, а это не то, что я ищу. Любая помощь или очки в правильном направлении будет принята с благодарностью.

поиск-перед тем

искать после

mmaximalist
источник
Что вы хотите случиться, когда пользователь нажимает на предложение? Просто заполните поле поиска этим?
Rarst
Перенесет вас в соответствующий пост. Пользователь по-прежнему может печатать и получать результаты поиска в обычном режиме, только кликнув по подсказке, вы перейдете к сообщению.
Максимум
У меня есть быстрое решение для заполнения, но связывание более проблематично ... Подумаю над этим.
Рев

Ответы:

20

Далее используется автозаполнение пользовательского интерфейса jQuery, которое включено в WordPress с версии 3.3. (Я позаимствовал формат у @Rarst : D).

Это все еще не совсем то, что вы ищете, но дает вам хорошую отправную точку. Следующее использует базовый стиль jQuery UI, но вы можете использовать тот, который в настоящее время разработан для trac, и вызывать его из папки подключаемого модуля.

class AutoComplete {

    static $action = 'my_autocomplete';//Name of the action - should be unique to your plugin.

    static function load() {
        add_action( 'init', array( __CLASS__, 'init'));
    }

    static function init() {
        //Register style - you can create your own jQuery UI theme and store it in the plug-in folder
        wp_register_style('my-jquery-ui','http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css');    
        add_action( 'get_search_form', array( __CLASS__, 'get_search_form' ) );
        add_action( 'wp_print_footer_scripts', array( __CLASS__, 'print_footer_scripts' ), 11 );
        add_action( 'wp_ajax_'.self::$action, array( __CLASS__, 'autocomplete_suggestions' ) );
        add_action( 'wp_ajax_nopriv_'.self::$action, array( __CLASS__, 'autocomplete_suggestions' ) );
    }

    static function get_search_form( $form ) {
        wp_enqueue_script( 'jquery-ui-autocomplete' );
        wp_enqueue_style('my-jquery-ui');
        return $form;
    }

    static function print_footer_scripts() {
        ?>
    <script type="text/javascript">
    jQuery(document).ready(function ($){
        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php' ); ?>';
        var ajaxaction = '<?php echo self::$action ?>';
        $("#secondary #searchform #s").autocomplete({
            delay: 0,
            minLength: 0,
            source: function(req, response){  
                $.getJSON(ajaxurl+'?callback=?&action='+ajaxaction, req, response);  
            },
            select: function(event, ui) {
                window.location.href=ui.item.link;
            },
        });
    });
    </script><?php
    }

    static function autocomplete_suggestions() {
        $posts = get_posts( array(
            's' => trim( esc_attr( strip_tags( $_REQUEST['term'] ) ) ),
        ) );
        $suggestions=array();

        global $post;
        foreach ($posts as $post): 
                    setup_postdata($post);
            $suggestion = array();
            $suggestion['label'] = esc_html($post->post_title);
            $suggestion['link'] = get_permalink();

            $suggestions[]= $suggestion;
        endforeach;

        $response = $_GET["callback"] . "(" . json_encode($suggestions) . ")";  
        echo $response;  
        exit;
    }
}
AutoComplete::load();
Стивен Харрис
источник
12

Хорошо, это будет очень простой пример кода, который использует собственное suggest.jsядро WP для Ajax и привязывается к форме поиска по умолчанию (из неизмененного get_search_form()вызова). Это не совсем то, что вы просили, но добавочный поиск - огромная боль, чтобы достичь совершенства. :)

class Incremental_Suggest {

    static function on_load() {

        add_action( 'init', array( __CLASS__, 'init' ) );
    }

    static function init() {

        add_action( 'wp_print_scripts', array( __CLASS__, 'wp_print_scripts' ) );
        add_action( 'get_search_form', array( __CLASS__, 'get_search_form' ) );
        add_action( 'wp_print_footer_scripts', array( __CLASS__, 'wp_print_footer_scripts' ), 11 );
        add_action( 'wp_ajax_incremental_suggest', array( __CLASS__, 'wp_ajax_incremental_suggest' ) );
        add_action( 'wp_ajax_nopriv_incremental_suggest', array( __CLASS__, 'wp_ajax_incremental_suggest' ) );
    }

    static function wp_print_scripts() {

        ?>
    <style type="text/css">
        .ac_results {
            padding: 0;
            margin: 0;
            list-style: none;
            position: absolute;
            z-index: 10000;
            display: none;
            border-width: 1px;
            border-style: solid;
        }

        .ac_results li {
            padding: 2px 5px;
            white-space: nowrap;
            text-align: left;
        }

        .ac_over {
            cursor: pointer;
        }

        .ac_match {
            text-decoration: underline;
        }
    </style>
    <?php
    }

    static function get_search_form( $form ) {

        wp_enqueue_script( 'suggest' );

        return $form;
    }

    static function wp_print_footer_scripts() {

        ?>
    <script type="text/javascript">
        jQuery(document).ready(function ($) {
            $('#s').suggest('<?php echo admin_url( 'admin-ajax.php' ); ?>' + '?action=incremental_suggest');
        });
    </script><?php
    }

    static function wp_ajax_incremental_suggest() {

        $posts = get_posts( array(
            's' => $_REQUEST['q'],
        ) );

        $titles = wp_list_pluck( $posts, 'post_title' );
        $titles = array_map( 'esc_html', $titles );
        echo implode( "\n", $titles );

        die;
    }
}

Incremental_Suggest::on_load();
Rarst
источник
0

Вы должны сделать это, используя Ajax, конечно, но здесь есть проблема. Поскольку WordPress использует MySQL, вы можете перегрузить свой сервер поиском, если попытаетесь заполнить поиск реальными запросами к базе данных через Ajax, но вы можете разработать систему, в которой все сообщения сохраняются в одной большой «wp_options». поле, а затем, когда поиск будет завершен, вы запрашиваете его, а не выполняете реальный поиск. Но помните, что вам нужно обновлять этот фрагмент текстовой / сериализованной переменной каждый раз, когда вы создаете или редактируете сообщение.

Если вы не хотите тратить какое-то время на разработку этого решения, я бы не советовал вам делать такой «живой поиск».

Webord
источник
2
В таком случае использование ресурсов MySQL-запросов было бы совершенно незначительным по сравнению с попаданием загрузки ядра WP для Ajax-запросов.
Rarst
1
Зависит от того, как вы пытаетесь выполнить Ajax-запрос, в этом случае вам действительно не нужно все ядро ​​WP для ответа, в лучшем случае просто загрузите $ wpdb и выполните поиск по полю. Но согласились, используя основной URL-адрес WP Ajax, оба они могли бы обернуться проблемой, если с ней не справиться.
Веборд
1
Да, я просто отмечаю, что производительность MySQL не будет узким местом (если вы не попадете в сотни тысяч постов и тому подобное). WP ядро ​​намного медленнее. Сеть тоже медленнее.
Rarst
Да, но выполнять некоторые виды Scalling с машинами WP Core гораздо проще и быстрее. С MySQL машины работают медленнее и сложнее. Но на нормальной установке я с тобой согласен.
Веборд