¿Cómo crear una búsqueda de autocompletar en vivo?

22

Actualmente estoy intentando crear una función de búsqueda de wordpress que muestre resultados en vivo debajo de la barra de búsqueda. Hay un ejemplo en el sitio web Banco Mundial (pantallas a continuación). No estoy buscando un autocompletar como el que encontrarías en Google.com, que completa las palabras que escribes, sino que quiero encontrar publicaciones reales en el sitio.

Intenté realizar una limpieza a través de Wordpress Answers y otros recursos similares, pero solo me he topado con la implementación de una búsqueda tipo Google, que no es lo que estoy buscando. Cualquier ayuda o puntos en la dirección correcta serían muy apreciados.

    
pregunta mmaximalist 20.02.2012 - 08:37

3 respuestas

19

Lo siguiente usa jQuery UI Autocomplete, que se ha incluido en WordPress desde 3.3. (He tomado prestado el formato de @Rarst : D).

Todavía no es precisamente lo que estás buscando, pero te da un buen punto de partida. A continuación se utiliza el estilo básico de la interfaz de usuario de jQuery, pero puede utilizar el que actualmente se encuentra en trac y llámalo desde tu carpeta de complementos.

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();
    
respondido por el Stephen Harris 20.02.2012 - 17:56
12

Bien, este sería un código de ejemplo muy básico que utiliza suggest.js nativo, núcleo de WP para Ajax y se enlaza al formulario de búsqueda predeterminado (de get_search_form() call sin modificar). No es precisamente lo que pediste, pero la búsqueda incremental es un gran dolor para ser perfecto. :)

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();
    
respondido por el Rarst 20.02.2012 - 13:15
0

Debes hacerlo usando Ajax, por supuesto, pero aquí hay un problema. Ya que WordPress usa MySQL, puede sobrecargar el servidor con la búsqueda si intenta completar la búsqueda con las consultas de la base de datos reales a través de Ajax, pero lo que podría hacer es desarrollar un sistema donde todas las publicaciones se guardan en una sola "wp_options" campo y luego, cuando se realiza una búsqueda, usted consulta desde ese lugar en lugar de hacer una búsqueda real. Pero recuerde que debe actualizar este fragmento de texto / variable serializada cada vez que cree o edite una publicación.

Si no está dispuesto a dedicar un tiempo a desarrollar esta solución, no le recomendaría que haga este tipo de "búsqueda en vivo".

    
respondido por el Webord 20.02.2012 - 10:09

Lea otras preguntas en las etiquetas