Autocompletar o sugerir automáticamente de la lista de títulos de publicaciones

13

Quiero tener una función de autocompletar o sugerir automáticamente en un formulario (búsqueda):

Cuando un usuario comienza a escribir, sugiere títulos de publicaciones que tienen texto coincidente.

También me gustaría que muestre algunos metadatos (un número) que he almacenado relacionados con cada publicación personalizada. Ejemplo:

Si escribo "A", sugiere "Manzanas (13), Aardvarks (51), Astronautas (21)", etc.

marctain
fuente
¿Cómo se llama el metacampo? Agregue el código que muestra exactamente cómo agregó el metacampo. Gracias.
kaiser
Supuse que el metacampo es un metacampo de publicación específicamente agregado (mediante la adición de un cuadro de meta), o una publicación de var personalizada, a la que se puede acceder con get_post_meta (iirc)
Barry Carlyon
De hecho, todavía no he agregado el metacampo.
marctain

Respuestas:

17

Si esto es posible.

Puede usar jQuery Auto Append, que se incluye con WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Con esto, puede escribir un formulario que realice una búsqueda de Ajax en el controlador de URL de Ajax. Al cual puedes agregar_acción. http://codex.wordpress.org/AJAX_in_Plugins

Por lo tanto, puede buscar ajax y luego, en el lado de la acción, puede realizar un get_posts para que coincida con los títulos, o una consulta sql sin formato. Y devolver lo que se necesita.

Eso debería ayudar, si tengo tiempo en breve podría escribir una solución de código completo. Pero la mayor parte es un complemento completo para ayudar a impulsar la búsqueda.

Editar: Aquí vamos, algo como esto debería hacerlo, no lo he probado, solo lo escribí en la parte superior de mi cabeza. Actualización: escape el texto ingresado, limitado por tipo de publicación personalizada y solo a publicaciones publicadas

2012-11-21 Edit: error tipográfico actualizado en la muestra de código.

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();
}
Barry Carlyon
fuente
Wow, gracias Barry! Le daré un giro, esto entra en funciones.php, ¿sí? Modificaré las partes necesarias y veré qué da
marctain
2
En teoría sí, en functions.php. Lo pegaría en un complemento para que esté fuera del camino. Si va directamente a functions.php, entonces se puede hacer una optimización, por lo que parte de este código se puede aplicar a funciones que ya existen en functions.php (depende del tema, por supuesto)
Barry Carlyon
Funciona ... casi! Debería haber especificado que quería que fuera de un tipo de mensaje personalizado
editaré
Actualizado para incluir el like_escape. No estoy usando un% al comienzo, ya que él quiere buscar dónde comienzan los títulos de las publicaciones con la primera letra ingresada. No es un partido global. Mi código de trabajo es con $ _REQUEST ['q'] sin opciones aplicadas a jQuery sugiere. Q emula lo que usan los motores de búsqueda.
Barry Carlyon
@BarryCarlyon Por favor, no edite todas las cosas menores. Si alcanzas 10 ediciones, se transformará automáticamente en un "wiki de la comunidad" y perderás todos los puntos de repetición. Y necesitamos más usuarios, que agreguen buenas respuestas y tengan un min. de reputación para hacer tareas como editar, agregar wikis, etc. Ah, y exit;siempre es más rápido que die();:)
kaiser