Auto-completare sau auto-sugestie din lista titlurilor articolelor

15 iul. 2012, 19:05:42
Vizualizări: 21.1K
Voturi: 13

Doresc să am o funcție de auto-completare sau auto-sugestie într-un formular (de căutare):

Când un utilizator începe să tasteze, aceasta să sugereze titluri de articole care conțin textul introdus.

De asemenea, aș dori să afișeze anumite meta-date (un număr) pe care le-am stocat în relație cu fiecare articol personalizat. Exemplu:

Dacă tastez "A", să sugereze "Mere (13), Aardvark (51), Astronauți (21)", etc.

3
Comentarii

Care este numele câmpului meta? Te rog adaugă codul care arată exact cum ai adăugat câmpul meta. Mulțumesc.

kaiser kaiser
15 iul. 2012 20:08:21

Am presupus că câmpul meta este un câmp specific adăugat la postare (prin adăugarea unei cutii meta), sau o variabilă personalizată a postării, care poate fi accesată cu get_post_meta (după cum îmi amintesc)

Barry Carlyon Barry Carlyon
15 iul. 2012 20:15:31

De fapt, încă nu am adăugat câmpul meta.

marctain marctain
15 iul. 2012 20:15:34
Toate răspunsurile la întrebare 1
10
19

Da, acest lucru este posibil.

Poți folosi jQuery Auto Suggest care este inclus în WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Cu acesta poți scrie un formular care face o căutare Ajax către handler-ul URL-ului Ajax. Pe care poți adăuga un add_action. http://codex.wordpress.org/AJAX_in_Plugins

Deci poți face o căutare Ajax și apoi pe partea de acțiune poți executa un get_posts pentru a potrivi titlurile, sau o interogare SQL directă. Și să returnezi ceea ce este necesar.

Asta ar trebui să te ajute, dacă voi avea timp în curând s-ar putea să scriu o soluție completă de cod. Dar cea mai mare parte este un întreg plugin pentru a ajuta la funcționalitatea de căutare.

Edit: Iată, ceva de genul acesta ar trebui să funcționeze, nu l-am testat, l-am scris din cap. Update: Escaparea textului introdus, limitarea după tipul de postare personalizată și doar la postările publicate

Edit 2012-11-21: actualizat typo în exemplul de cod.

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 iul. 2012 19:39:06
Comentarii

Wow, mulțumesc Barry! O să încerc, asta se adaugă în functions.php, da? O să modific părțile necesare și voi vedea ce iese

marctain marctain
15 iul. 2012 19:58:33

Teoretic da, în functions.php. Aș pune acest cod într-un plugin ca să fie separat. Dacă se adaugă direct în functions.php, atunci se pot face unele optimizări, așa că o parte din acest cod poate fi aplicat funcțiilor care există deja în functions.php (în funcție de tema folosită, desigur)

Barry Carlyon Barry Carlyon
15 iul. 2012 19:59:35

Am actualizat codul pentru a include like_escape. Nu folosesc % la început, deoarece vrem să căutăm titlurile postărilor care încep cu prima literă introdusă. Nu este o potrivire globală. Codul meu funcțional folosește $_REQUEST['q'] fără opțiuni aplicate pentru jQuery suggest. Q emulează ceea ce folosesc motoarele de căutare.

Barry Carlyon Barry Carlyon
15 iul. 2012 20:07:57

Funcționează... aproape! Ar fi trebuit să precizez că doream să fie dintr-un custom-post-type, voi edita întrebarea mea

marctain marctain
15 iul. 2012 20:07:57

@BarryCarlyon Te rog nu edita fiecare detaliu minor. Dacă ajungi la 10 editări, aceasta va fi automat transformată într-un "wiki al comunității" și vei pierde toate punctele de reputație. Avem nevoie de mai mulți utilizatori care adaugă răspunsuri bune și au un număr minim de reputație pentru a efectua sarcini precum editarea, adăugarea de wiki-uri etc. Ah, și exit; este întotdeauna mai rapid decât die(); :)

kaiser kaiser
15 iul. 2012 20:10:29

Ultima notă: Nu salva variabile pe care le folosești doar o singură dată ($id = $row->ID). Folosește-le direct.

kaiser kaiser
15 iul. 2012 20:11:55

@kaiser documentația WordPress: http://codex.wordpress.org/AJAX_in_Plugins afirmă că ar trebui să folosești die(); pentru asta. Altfel, aș fi de acord

Barry Carlyon Barry Carlyon
15 iul. 2012 20:12:24

Forța obișnuinței fac $x = $row->x, de obicei buclele mele fac mult mai multe lucruri

Barry Carlyon Barry Carlyon
15 iul. 2012 20:13:23

Minunat! Doar din curiozitate, există vreo modalitate de a seta asta astfel încât să poți pasa direct un tip de postare pentru a-l obține? Am câteva tipuri diferite de postări pentru care aș putea avea nevoie de asta. Momentan mă gândesc să setez un transient când caseta de text este configurată și apoi să-l preiau în acest script...

Kaji Kaji
14 feb. 2015 08:43:52

Sigur, doar înlocuiește "AND post_type = \'post_type_name\'" cu codul pentru a prelua post_type_name din $_REQUEST (escapat corespunzător) și asigură-te că formularul tău de căutare include un câmp ascuns cu valoarea ta. Deci "<input type="hidden" name="post_type" value="somename" />" și substituie în interogare

Barry Carlyon Barry Carlyon
14 feb. 2015 13:25:57
Arată celelalte 5 comentarii