Autocompletar o autosugerir desde una lista de títulos de publicaciones
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.

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

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

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)

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.

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

@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();
:)

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

@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

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

¡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...

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
