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.


¿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();
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.