Autocompletamento o suggerimento automatico dall'elenco dei titoli dei post
Voglio avere una funzione di autocompletamento o suggerimento automatico su un modulo (di ricerca):
Quando un utente inizia a digitare, il sistema suggerisce i titoli dei post che contengono il testo corrispondente.
Vorrei anche che visualizzasse alcuni meta-dati (un numero) che ho memorizzato relativi a ciascun post personalizzato. Esempio:
Se digito "A", suggerisce "Mele (13), Formichieri (51), Astronauti (21)", ecc.

Sì, questo è possibile.
Puoi usare jQuery Auto Suggest che è incluso in WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script
Con questo puoi scrivere un form che effettua una ricerca Ajax verso il gestore di URL Ajax. Su cui puoi aggiungere un add_action. http://codex.wordpress.org/AJAX_in_Plugins
Quindi puoi effettuare una ricerca Ajax e poi sul lato dell'azione puoi semplicemente eseguire un get_posts per trovare corrispondenze nei titoli, o una query SQL diretta. E restituire ciò che è necessario.
Questo dovrebbe aiutare, se avrò tempo a breve potrei scrivere una soluzione completa con il codice. Ma la maggior parte consiste in un intero plugin per supportare la ricerca.
Modifica: Ecco qui, qualcosa del genere dovrebbe funzionare, non l'ho testato, l'ho scritto al volo. Aggiornamento: Escaping del testo inserito, filtro per custom post type e solo post pubblicati
Modifica 2012-11-21: aggiornato refuso nell'esempio di codice.
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, grazie Barry! Proverò a usarlo, questo va nel file functions.php, giusto? Modificherò le parti necessarie e vedrò cosa succede

In teoria sì, nel file functions.php. Personalmente lo inserirei in un plugin per tenerlo separato. Se lo metti direttamente in functions.php si possono fare alcune ottimizzazioni, quindi parte di questo codice può essere applicato a funzioni già esistenti in functions.php (dipende dal tema, ovviamente)

Aggiornato per includere like_escape. Non sto usando un % all'inizio, perché vuole cercare dove i titoli dei post iniziano con la prima lettera inserita. Non una corrispondenza globale. Il mio codice funzionante usa $_REQUEST['q'] senza opzioni applicate a jQuery suggest. Q emula ciò che usano i motori di ricerca.

Funziona... quasi! Avrei dovuto specificare che volevo che fosse da un custom-post-type, modificherò la mia domanda

@BarryCarlyon Per favore non modificare ogni piccola cosa. Se raggiungi 10 modifiche verrà automaticamente trasformato in un "community wiki" e perderai tutti i punti di reputazione. E abbiamo bisogno di più utenti che aggiungano buone risposte e abbiano un numero minimo di reputazione per fare compiti come modificare, aggiungere wiki, ecc. Oh, e exit;
è sempre più veloce di die();
:)

Ultima nota: Non salvare variabili che usi solo una volta ($id = $row->ID
). Usale direttamente.

@kaiser la documentazione di WordPress: http://codex.wordpress.org/AJAX_in_Plugins afferma che dovresti usare die(); per questo. Altrimenti sarei d'accordo

Forza dell'abitudine faccio $x = $row->x normalmente i miei cicli fanno molte più cose

Fantastico! Giusto per curiosità, c'è un modo per impostarlo in modo da poter passare direttamente un post type da ottenere? Ho un paio di diversi post type per cui potrei averne bisogno. Attualmente sto valutando di impostare un transient quando viene configurato il box di testo e poi recuperarlo in questo script...

Certo, sostituisci "AND post_type = \'post_type_name\'" con il codice per recuperare il post_type_name da $_REQUEST (adeguatamente filtrato) e assicurati che il modulo di ricerca includa un campo nascosto con il tuo valore. Quindi "<input type="hidden" name="post_type" value="somename" />" e sostituiscilo nella query
