Autocompletar o autosugerir desde una lista de títulos de publicaciones

15 jul 2012, 19:05:42
Vistas: 21.1K
Votos: 13

Quiero tener una función de autocompletado o autosugerencia en un formulario (de búsqueda):

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

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

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

3
Comentarios

¿Cuál es el nombre del campo meta? Por favor, agrega el código que muestre exactamente cómo agregaste el campo meta. Gracias.

kaiser kaiser
15 jul 2012 20:08:21

He asumido que el campo meta es un campo de meta específicamente añadido (mediante la adición de un meta box), o una variable de post personalizada, que puede ser accedida con get_post_meta (si mal no recuerdo)

Barry Carlyon Barry Carlyon
15 jul 2012 20:15:31

En realidad aún no he agregado el campo meta.

marctain marctain
15 jul 2012 20:15:34
Todas las respuestas a la pregunta 1
10
19

Sí, esto es posible.

Puedes usar jQuery Auto Suggest que viene incluido con WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Con esto puedes escribir un formulario que haga una búsqueda Ajax al manejador de URL Ajax. Al cual puedes agregarle un add_action. http://codex.wordpress.org/AJAX_in_Plugins

Así que puedes hacer una búsqueda Ajax y luego en el lado de la acción simplemente realizar un get_posts para coincidir títulos, o una consulta SQL directa. Y devolver lo que sea necesario.

Eso debería ayudar, si tengo tiempo pronto podría escribir una solución de código completa. Pero la mayor parte es un plugin completo para ayudar con la búsqueda.

Edición: Aquí vamos, algo como esto debería funcionar, no lo he probado, lo escribí de memoria. Actualización: Escapar el texto ingresado, filtrar por tipo de post personalizado y solo posts publicados

Edición 2012-11-21: corregido error tipográfico en el ejemplo 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();
}
15 jul 2012 19:39:06
Comentarios

¡Guau, gracias Barry! Voy a probarlo, esto va en functions.php, ¿verdad? Modificaré las partes necesarias y veré qué resulta

marctain marctain
15 jul 2012 19:58:33

En teoría sí, en functions.php. Yo lo pondría en un plugin para que no estorbe. Si va directamente en functions.php, se puede optimizar un poco, así que parte de este código se podría aplicar a funciones que ya existen en functions.php (dependiendo del tema, claro)

Barry Carlyon Barry Carlyon
15 jul 2012 19:59:35

Actualizado para incluir like_escape. No estoy usando un % al principio, ya que quiere buscar donde los títulos de las publicaciones comienzan con la primera letra ingresada. No es una coincidencia global. Mi código funcional usa $_REQUEST['q'] sin opciones aplicadas a jQuery suggest. Q emula lo que usan los motores de búsqueda.

Barry Carlyon Barry Carlyon
15 jul 2012 20:07:57

Funciona... ¡casi! Debería haber especificado que quería que fuera de un custom-post-type, editaré mi pregunta.

marctain marctain
15 jul 2012 20:07:57

@BarryCarlyon Por favor, no edites cada detalle menor. Si llegas a 10 ediciones, se convertirá automáticamente en un "wiki comunitario" y perderás todos los puntos de reputación. Necesitamos más usuarios que aporten buenas respuestas y tengan un mínimo de reputación para realizar tareas como editar, añadir wikis, etc. Ah, y exit; siempre es más rápido que die(); :)

kaiser kaiser
15 jul 2012 20:10:29

Última nota: No guardes variables que solo usas una vez ($id = $row->ID). Úsalas directamente.

kaiser kaiser
15 jul 2012 20:11:55

@kaiser la documentación de WordPress: http://codex.wordpress.org/AJAX_in_Plugins indica que deberías usar die(); para esto. De otra forma, estaría de acuerdo

Barry Carlyon Barry Carlyon
15 jul 2012 20:12:24

Fuerza de hábito hacer $x = $row->x, normalmente mis bucles hacen muchas más cosas

Barry Carlyon Barry Carlyon
15 jul 2012 20:13:23

¡Increíble! Solo por curiosidad, ¿hay alguna forma de configurar esto para que puedas pasarle directamente un tipo de post para obtener? Tengo un par de tipos de post diferentes para los que podría necesitar esto. Actualmente estoy considerando establecer un transitorio cuando se configura el cuadro de texto y luego recuperarlo en este script...

Kaji Kaji
14 feb 2015 08:43:52

Claro, solo reemplaza "AND post_type = \'post_type_name\'" con el código para obtener el post_type_name desde $_REQUEST (adecuadamente escapado) y asegúrate que tu formulario de búsqueda incluya un campo oculto con tu valor. Así "<input type="hidden" name="post_type" value="somename" />" y sustitúyelo en la consulta

Barry Carlyon Barry Carlyon
14 feb 2015 13:25:57
Mostrar los 5 comentarios restantes