Autouzupełnianie lub automatyczne sugerowanie z listy tytułów postów


13

Chcę mieć funkcję autouzupełniania lub autosugestii w formularzu (wyszukiwania):

Gdy użytkownik zaczyna pisać, sugeruje tytuły postów zawierające pasujący tekst.

Chciałbym również, aby wyświetlał niektóre metadane (liczbę), które zapisałem, związane z każdym niestandardowym postem. Przykład:

Jeśli wpisuję „A”, sugeruje „Jabłka (13), Aardvarki (51), Astronauci (21)” itp.


Jak nazywa się pole meta? Dodaj kod dokładnie pokazujący sposób dodania pola meta. Dzięki.
kaiser

Przyjąłem założenie, że pole meta to specjalnie dodane pole meta post (przez dodanie pola meta) lub niestandardowy var post, do którego można uzyskać dostęp za pomocą get_post_meta (iirc)
Barry Carlyon

Właściwie nie dodałem jeszcze pola meta.
marzec

Odpowiedzi:


17

Tak, to jest możliwe.

Możesz użyć jQuery Auto Suggest, który jest zawarty w WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Dzięki temu możesz napisać formularz wyszukujący Ajax w module obsługi Ajax URL. Do którego możesz dodać aktywność. http://codex.wordpress.org/AJAX_in_Plugins

Możesz więc wyszukać ajax, a następnie po stronie akcji możesz po prostu wykonać get_posts, aby dopasować tytuły lub surowe zapytanie SQL. I zwróć to, czego potrzebujesz.

To powinno pomóc, jeśli wkrótce dostanę czas, mogę napisać pełne rozwiązanie dla kodu. Ale większość z nich to cała wtyczka, która wspomaga wyszukiwanie.

Edycja: Proszę bardzo, coś takiego powinno to zrobić, nie przetestowałem tego, po prostu zapisałem to sobie z głowy. Aktualizacja: uniknij wprowadzonego tekstu, zawęź według niestandardowego typu posta i tylko do opublikowanych postów

21.11.2012 Edycja: zaktualizowana literówka w próbce kodu.

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, dzięki Barry! Dam mu wir, to idzie do funkcji. Php, tak? Zmodyfikuję niezbędne części i zobaczę, co to daje
marzec

2
Teoretycznie tak, w funkcje.php. Włożyłbym to do wtyczki, żeby nie przeszkadzało. Jeśli przejdzie bezpośrednio do functions.php, można dokonać optymalizacji, więc część tego kodu można zastosować do funkcji, które już istnieją w functions.php (oczywiście zależne od tematu)
Barry Carlyon

Działa .. prawie! Powinienem był sprecyzować, że chcę, żeby pochodziło z niestandardowego typu posta,
zredaguję

Zaktualizowano, aby zawierał podobną wersję. Nie używam% na początku, ponieważ chce wyszukać, gdzie zaczynają się tytuły postów od pierwszej wprowadzonej litery. Nie jest to globalny mecz. Mój kod działa z $ _REQUEST ['q'] bez żadnych opcji zastosowanych do sugestii jQuery. Q emuluje, z czego korzystają wyszukiwarki.
Barry Carlyon,

@BarryCarlyon Proszę nie edytować każdej drobnej rzeczy. Jeśli osiągniesz 10 edycji, zostanie ona automatycznie przekształcona w „wiki społeczności” i stracisz wszystkie punkty powtórzeń. Potrzebujemy więcej użytkowników, którzy dodadzą dobre odpowiedzi i dostaną min.-nr. reputacji robić zadań, takich jak edycja, dodawanie wiki itp Aha, i exit;jest zawsze szybszy niż die();:)
Kaiser
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.