• Resolvido jojulio

    (@jojulio)


    Estou criando um campo de busca no WordPress, mas eu preciso que esse campo de busca retorne posts de um post_type que eu criei, a busca recebe três campos: estado, cidade e bairro. No meu post_type esses campos são preenchidos por campos personalizados que eu criei.
    Não tenho muita experiência com WordPress, ainda estou começando, sei que a busca padrão do WP só procura os dados nos campos post_title e post_content, por isso esbarrei nessa dificuldade, eu preciso buscar dentro de um post_type especifico.
    Vou mostrar os códigos que eu desenvolvi até o momento.

    Esse é o meu campo de busca:

    <form action="<?php echo get_home_url(); ?>/" method="get">
    	 <input type="text" name="s" hidden>
    	    <select name="uf" id="uf">
                  <option value="">Estado:</option>
                  <option value="AC">AC</option>
    	      <option value="AL">...</option>
    	    </select>
           <input name="cidade" type="text" placeholder="Cidade:">
           <input name="bairro" type="text" placeholder="Bairro:">
           <input type="submit" class="submit" value=" ">
    </form>

    Um amigo me disse para fazer interceptar a busca padrão do WP, no meu functions.php eu coloquei o seguinte código:

    add_action( 'pre_get_posts', 'intercepta_busca');
    
    function intercepta_busca( $query ) {
    
        if( is_admin() ) {
            return;
        }
    
        if( $query->is_main_query() && $query->is_search() ) {
    
            $query->set( 'post_type', array('sala') );
            $query->set( 'meta_query', array(
                'relation' => 'OR', 
                array(
                    'key' => 'estado',
                    'value' => $query->query_vars['s'],
                    'compare' => 'LIKE'
                ),
                array(
                    'key' => 'cidade',
                    'value' => $query->query_vars['s'],
                    'compare' => 'LIKE'
                ),
                array(
                    'key' => 'bairro',
                    'value' => $query->query_vars['s'],
                    'compare' => 'LIKE'
                ),
            ) );
        }
    
    }

    No meu search.php estou apenas dando um echo pra ver se aparece alguma coisa:

    
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    
        <?php echo get_the_title(); ?>
        <?php echo get_the_content(); ?>
        <?php echo get_the_excerpt(); ?>
    
    <?php endwhile; ?>
    <?php endif; ?>

    Agradeço desde já.

    • Este tópico foi modificado 7 anos, 9 meses atrás por jojulio.
Visualizando 5 respostas - 1 até 5 (de um total de 5)
  • Moderador Felipe Elia

    (@felipeelia)

    Oi @jojulio,

    Experimente esvaziar o parâmetro s depois de configurar a meta_query:

    if( $query->is_main_query() && $query->is_search() ) {
    
        $query->set( 'post_type', array('sala') );
        $query->set( 'meta_query', array(
            'relation' => 'OR', 
            array(
                'key' => 'estado',
                'value' => $query->query_vars['s'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'cidade',
                'value' => $query->query_vars['s'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'bairro',
                'value' => $query->query_vars['s'],
                'compare' => 'LIKE'
            ),
        ) );
        // Acrescente esta linha aqui:
        $query->set( 's', NULL );
    }

    Não esqueça de voltar para dizer se funcionou, ok?

    Criador do tópico jojulio

    (@jojulio)

    Obrigado por sua ajuda, Felipe!

    Fiz o teste, e esvaziando o parâmetro s a busca retorna todas as salas cadastradas.

    O LIKE é o termo correto para comparação?

    Moderador Felipe Elia

    (@felipeelia)

    Agora, reparando melhor no seu código, existe um problema central nele: você não está usando os valores que o usuário informou. Use

    array(
        'key' => 'estado',
        'value' => $_GET['estado'],
        'compare' => 'LIKE'
    ),

    substituindo o $_GET['estado'] pelos nomes de cada campo.

    Sobre o LIKE, depende @jojulio. Se você quiser pegar as salas que tem qualquer um desses campos com valores que contenham a string passada pelo usuário, a resposta é sim, você deve continuar com o LIKE mesmo. Acertando isso aí de cima acho que vai ficar mais fácil de entender.

    Criador do tópico jojulio

    (@jojulio)

    Perfeito, Felipe. Deu certo desta forma e não foi necessário esvaziar o parâmetro s.

    Entendi sobre o LIKE.

    Obrigado, mais uma vez.

    Moderador Felipe Elia

    (@felipeelia)

    Não esquece de marcar o tópico como resolvido, @jojulio 🙂

Visualizando 5 respostas - 1 até 5 (de um total de 5)
  • O tópico ‘Campo de busca com WordPress em post_type’ está fechado para novas respostas.