Automatisch vervollständigen oder automatisch aus der Liste der Beitragstitel vorschlagen

13

Ich möchte eine Funktion zum automatischen Ausfüllen oder Vorschlagen in einem (Such-) Formular haben:

Wenn ein Benutzer mit der Eingabe beginnt, schlägt er Post-Titel mit übereinstimmendem Text vor.

Ich möchte auch, dass Metadaten (eine Nummer) angezeigt werden, die ich für jeden benutzerdefinierten Beitrag gespeichert habe. Beispiel:

Wenn ich "A" eingebe, wird "Äpfel (13), Erdferkel (51), Astronauten (21)" usw. vorgeschlagen.

Marctain
quelle
Wie heißt das Metafeld? Bitte fügen Sie den Code hinzu, der genau zeigt , wie Sie das Metafeld hinzugefügt haben. Vielen Dank.
Kaiser
Ich habe die Annahme getroffen, dass das Meta-Feld ein speziell hinzugefügtes Post-Meta-Feld (durch Meta-Box-Addition) oder eine benutzerdefinierte Post-Var ist, auf die mit get_post_meta (iirc)
Barry Carlyon,
Ich habe das Metafeld noch nicht hinzugefügt.
Marctain

Antworten:

17

Ja das ist möglich

Sie können jQuery Auto Suggest verwenden, das in WordPress enthalten ist: http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Mit diesem können Sie ein Formular schreiben, das eine Ajax-Suche für den Ajax-URL-Handler durchführt. Welche können Sie add_action auf. http://codex.wordpress.org/AJAX_in_Plugins

Sie können also eine Ajax-Suche durchführen und dann auf der Aktionsseite einfach get_posts ausführen, um mit Titeln übereinzustimmen, oder eine rohe SQL-Abfrage. Und geben Sie zurück, was Sie brauchen.

Das sollte helfen, wenn ich in Kürze Zeit habe, könnte ich eine vollständige Codelösung schreiben. Aber der Großteil davon ist ein ganzes Plugin, das die Suche unterstützt.

Edit: Los geht's, so etwas sollte es tun, habe es noch nicht getestet, habe es einfach über den Kopf geschrieben. Update: Escape-Zeichen für den eingegebenen Text, Eingrenzen nach benutzerdefiniertem Beitragstyp und nur für veröffentlichte Beiträge

2012-11-21 Bearbeiten: Tippfehler im Codebeispiel aktualisiert.

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();
}
Barry Carlyon
quelle
Wow, danke Barry! Ich werde es versuchen, das geht in die Funktionen.php, ja? Ich werde die notwendigen Teile modifizieren und sehen, was es gibt
marctain
2
Theoretisch ja, in die functions.php. Ich würde es in ein Plugin stecken, damit es nicht im Weg ist. Wenn es direkt in die Datei functions.php geht, können einige Optimierungen vorgenommen werden, sodass ein Teil dieses Codes auf Funktionen angewendet werden kann, die bereits in der Datei functions.php vorhanden sind (natürlich
themenabhängig
Es funktioniert ... fast! Ich hätte angeben sollen, dass es von einem benutzerdefinierten Post-Typ sein soll. Ich bearbeite meine Frage
Marctain
Aktualisiert, um like_escape einzuschließen. Ich verwende am Anfang kein%, da er suchen möchte, wo die Post-Titel mit dem ersten eingegebenen Buchstaben beginnen. Kein globales Spiel. Mein Arbeitscode ist mit einem $ _REQUEST ['q'] ohne auf jQuery suggest angewendete Optionen. Q emuliert, was Suchmaschinen verwenden.
Barry Carlyon
@BarryCarlyon Bitte nicht jede Kleinigkeit bearbeiten. Wenn du 10 Änderungen erreichst, wird es automatisch in ein "Community-Wiki" umgewandelt und du verlierst alle Wiederholungspunkte. Und wir brauchen mehr Benutzer, die gute Antworten hinzufügen und eine min.-nr. von Ruf, Aufgaben wie Bearbeiten, Hinzufügen von Wikis usw. zu tun Oh, und exit;ist immer schneller als die();:)
Kaiser