Autocompletamento o suggerimento automatico dall'elenco dei titoli dei post

15 lug 2012, 19:05:42
Visualizzazioni: 21.1K
Voti: 13

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.

3
Commenti

Qual è il nome del meta field? Per favore aggiungi il codice che mostra esattamente come hai aggiunto il meta field. Grazie.

kaiser kaiser
15 lug 2012 20:08:21

Ho fatto l'ipotesi che il meta field sia un campo meta aggiunto specificamente (tramite aggiunta di meta box), o una variabile personalizzata del post, che può essere accessibile con get_post_meta (se ricordo bene)

Barry Carlyon Barry Carlyon
15 lug 2012 20:15:31

In realtà non ho ancora aggiunto il meta field.

marctain marctain
15 lug 2012 20:15:34
Tutte le risposte alla domanda 1
10
19

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();
}
15 lug 2012 19:39:06
Commenti

Wow, grazie Barry! Proverò a usarlo, questo va nel file functions.php, giusto? Modificherò le parti necessarie e vedrò cosa succede

marctain marctain
15 lug 2012 19:58:33

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)

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

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.

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

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

marctain marctain
15 lug 2012 20:07:57

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

kaiser kaiser
15 lug 2012 20:10:29

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

kaiser kaiser
15 lug 2012 20:11:55

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

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

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

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

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

Kaji Kaji
14 feb 2015 08:43:52

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

Barry Carlyon Barry Carlyon
14 feb 2015 13:25:57
Mostra i restanti 5 commenti