Preenchimento automático ou sugestão automática da lista de títulos de postagem


13

Desejo ter uma função de preenchimento automático ou sugestão automática em um formulário (de pesquisa):

Quando um usuário começa a digitar, ele sugere títulos de postagem com texto correspondente.

Também gostaria que ele exibisse alguns metadados (um número) que armazenei relacionados a cada postagem personalizada. Exemplo:

Se eu digitar "A", ele sugere "Maçãs (13), Aardvarks (51), Astronautas (21)" etc.


Qual é o nome do campo meta? Adicione o código que mostra exatamente como você adicionou o campo meta. Obrigado.
Kaiser

Eu fiz a suposição de campo meta é um campo especificamente acrescentou pós meta (por meta Além caixa), ou um post personalizado var, que pode ser acessado com get_post_meta (IIRC)
Barry Carlyon

Na verdade, ainda não adicionei o campo meta.
15133 MarcellJul

Respostas:


17

Sim, isso é possível.

Você pode usar o jQuery Auto Suggest, incluído no WordPress http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Com isso, você pode escrever um formulário que faça uma pesquisa do Ajax no manipulador de URL do Ajax. Você pode adicionar a ação. http://codex.wordpress.org/AJAX_in_Plugins

Assim, você pode pesquisar no ajax e, no lado da ação, você pode simplesmente executar um get_posts para corresponder aos títulos ou uma consulta sql bruta. E devolva o que é necessário.

Isso deve ajudar, se eu tiver tempo em breve, posso escrever uma solução de código completo. Mas a maior parte é um plugin completo para ajudar a melhorar a pesquisa.

Edit: Aqui vamos nós, algo como isto deve fazê-lo, não o testou, apenas o escrevi em cima da minha cabeça. Atualização: escape do texto digitado, restrinja por tipo de postagem personalizada e apenas para postagens publicadas

2012-11-21 Edit: erro de digitação atualizado no exemplo de código.

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();
}

Uau, obrigado Barry! Vou dar uma olhada, isso entra em functions.php, sim? Vou modificar as peças necessárias e ver o que dá
marctain

2
Em teoria, sim, em functions.php. Eu colocá-lo em um plugin para que fique fora do caminho. Se ele vai direto para functions.php, então alguma otimização pode ser feito, de modo algum deste código pode ser aplicado a funções que já existem no functions.php (tema dependente é claro)
Barry Carlyon

Funciona .. quase! Eu deveria ter especificado que eu queria que fosse de um post-tipo personalizado, eu vou editar a minha pergunta
marctain

Atualizado para incluir o like_escape. Não estou usando um% no início, pois ele deseja pesquisar onde os títulos das postagens começam com a primeira letra inserida. Não é uma correspondência global. Meu código de trabalho está com um $ _REQUEST ['q'] sem opções aplicadas à sugestão do jQuery. Q emula o que os mecanismos de pesquisa usam.
Barry Carlyon

@ BarryCarlyon Por favor, não edite todas as coisas menores. Se você atingir 10 edições, ele será automaticamente transformado em um "wiki da comunidade" e você perderá todos os pontos de repetição. E precisamos de mais usuários, que adicionem boas respostas e tenham um min.-nr. da reputação de fazer tarefas como editar, adicionando wikis, etc. Ah, e exit;é sempre mais rápido do que die();:)
kaiser
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.