Criando um formulário de pesquisa para campos personalizados

10

Eu construí um tema para uma concessionária de carros. Cada carro é um tipo de postagem personalizado ("veículo") e tem cerca de 12 campos personalizados com itens como Marca, Modelo, Milhagem, Tipo de Combustível, etc. etc.

Então, basicamente, na home page, eu quero um formulário de pesquisa que tenha listas suspensas de Make & Modele e contenha quaisquer marcas ou modelos disponíveis.

Eu também quero que ele tenha duas opções para o Ano, para que o usuário final possa selecionar "2006" e "2012" e os resultados da pesquisa contêm todos os veículos com o ano entre esses dois números.

Existe um plugin que pode fazer isso ??

Obrigado por qualquer ajuda .. isso tem me deixado louco por horas !!!!

    
por absdigital 15.10.2014 / 14:49

2 respostas

13
  

por Mayeenul Islam 15.10.2014 / 17:45
17

Embora a resposta do @MayeenulIslam possa funcionar, acho que a maneira correta de fazer uma pesquisa avançada é usar o gancho pre_get_posts action.

Etapa 1: formulário de pesquisa

Este passo é igual ao passo 1 da outra resposta, apenas alterou o id do campo "nome" utilizado para a pesquisa para "s", por isso será utilizado diretamente como campo de pesquisa. Salve este código em searchform-advanced.php na pasta do seu tema. Em seguida, use get_template_part( 'advanced', 'searchform' ); para carregá-lo onde deseja que ele apareça no seu tema:

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

Etapa 2: adicione filtros à consulta de pesquisa

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

Etapa 3: modelo (opcional)

Com esse método, o modelo de pesquisa padrão do WordPress será usado para filtrar os resultados sem a necessidade de uma consulta secundária. Se você quiser usar um modelo diferente para pesquisa avançada, poderá usar o filtro template_include . Por exemplo, se você quiser usar o arquivo advanced-search-template.php como modelo para os resultados do formulário de pesquisa avançada:

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}
    
por cybmeta 02.02.2015 / 11:04