Compléter ou suggérer automatiquement à partir de la liste des titres des articles


13

Je veux avoir une fonction de saisie automatique ou de suggestion automatique sur un formulaire (de recherche):

Lorsqu'un utilisateur commence à taper, il suggère des titres de publication dont le texte correspond.

J'aimerais également qu'il affiche certaines métadonnées (un nombre) que j'ai stockées en rapport avec chaque publication personnalisée. Exemple:

Si je tape "A", cela suggère "Pommes (13), Aardvarks (51), Astronautes (21)", etc.


Quel est le nom du champ méta? Veuillez ajouter le code qui montre exactement comment vous avez ajouté le champ méta. Merci.
kaiser

J'ai fait l'hypothèse que le champ méta est un champ post méta spécifiquement ajouté (par ajout de meta box), ou un var post personnalisé, qui peut être consulté avec get_post_meta (iirc)
Barry Carlyon

En fait, je n'ai pas encore ajouté le champ méta.
marctain

Réponses:


17

Oui c'est possible.

Vous pouvez utiliser jQuery Auto Suggest qui est inclus avec WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Avec cela, vous pouvez écrire un formulaire qui effectue une recherche Ajax dans le gestionnaire d'URL Ajax. Sur lequel vous pouvez ajouter_action. http://codex.wordpress.org/AJAX_in_Plugins

Vous pouvez donc ajax lookup, puis du côté de l'action, vous pouvez simplement effectuer un get_posts pour faire correspondre les titres, ou une requête SQL brute. Et retournez ce qui est nécessaire.

Cela devrait aider, si j'ai peu de temps, je pourrais écrire une solution de code complète. Mais l'essentiel est un plugin entier pour aider à alimenter la recherche.

Edit: Voilà, quelque chose comme ça devrait le faire, je ne l'ai pas testé, je l'ai simplement écrit du haut de ma tête. Mise à jour: échapper le texte saisi, restreindre par type de publication personnalisé et uniquement aux publications publiées

2012-11-21 Edit: mise à jour de la faute de frappe dans l'exemple de code.

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, merci Barry! Je vais lui faire un tourbillon, cela va dans functions.php, oui? Je vais modifier les pièces nécessaires et voir ce que ça donne
marctain

2
En théorie oui, dans functions.php. Je le collerais dans un plugin donc c'est à l'écart. S'il va directement dans functions.php, une optimisation peut être effectuée, donc une partie de ce code peut être appliquée à des fonctions qui existent déjà dans functions.php (en fonction du thème bien sûr)
Barry Carlyon

Cela fonctionne .. presque! J'aurais dû spécifier que je voulais que ce soit à partir d'un type de post personnalisé, je modifierai ma question
marctain

Mis à jour pour inclure le like_escape. Je n'utilise pas de% au début, car il veut rechercher où commencent les titres des articles avec la première lettre entrée. Pas un match mondial. Mon code de travail est avec un $ _REQUEST ['q'] sans aucune option appliquée à jQuery suggérer. Q émule ce que les moteurs de recherche utilisent.
Barry Carlyon

@BarryCarlyon Veuillez ne pas modifier chaque chose mineure. Si vous atteignez 10 modifications, il sera automatiquement transformé en un "wiki communautaire" et vous perdrez tous les points de représentation. Et nous avons besoin de plus d'utilisateurs, qui ajoutent de bonnes réponses et ont obtenu un min.-nr. de réputation pour faire des tâches comme l'édition, l'ajout de wikis, etc. Oh, et exit;c'est toujours plus rapide que die();:)
kaiser
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.