Criando um formulário de pesquisa para campos personalizados

11

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

Então, basicamente, na página inicial, quero um formulário de pesquisa que tenha listas suspensas para Make & Model e contenha marcas ou modelos disponíveis.

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

Existe um plugin lá fora, que pode fazer isso?

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

absdigital
fonte
Eu acho que você pode usar isso, plug-in para ajudá-lo a melhor wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI
Obrigado .. Mas isso não explica como realmente criar o formulário de pesquisa. Quero dizer, posso programar o formulário em HTML, mas como faço para que ele funcione ?!
absdigital

Respostas:

16

______UPDATE_______
Embora eu esteja recebendo mais e mais votos, e a solução funcione, mas a resposta do cybmeta é realmente a resposta que é legal e do jeito do WordPress. Você definitivamente deveria tentar isso.

Passo 1

Comece criando um Formulário de pesquisa avançada com o qual você deseja que seu usuário interaja com o site e salve-o com um nome (ou seja, eu o salvei como advanced-searchform.php- mas não o salve com - searchform.phpele substituirá o formulário de pesquisa padrão do WordPress ):

<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="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" 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 1', 'textdomain' ); ?></option>
    </select>

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

</form>

Em seguida, chame o formulário para o seu modelo da seguinte maneira:

<?php get_template_part( 'advanced', 'searchform' ); ?>

Agora, o seu formulário de pesquisa está pronto, e agora você pode usá-lo e inserir a entrada do usuário no URL.

Passo 2

O que você só precisa é: consultar o banco de dados e consultar o tipo de postagem e seus campos personalizados conforme a consulta de pesquisa . Lembre-se de que sua consulta de pesquisa agora é o URL que você obteve após o envio do formulário. Agora peça ao WordPress para carregar sua página de resultados de pesquisa personalizada quando o formulário for enviado. Coloque a seguinte função no seu functions.phppara que ele ative seu modelo de pesquisa personalizado em vez do padrão search.php:

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

Trouxe o código para algum lugar do WPSE (esqueci a raiz), mas há controvérsia ao usar o código acima. Mas ele realmente funciona ( desculpa esfarrapada, é claro ).

Verifique de outra maneira o @GM sugerido.

etapa 3

Crie um novo arquivo e salve-o com advanced-search-result.php(porque usamos esse nome functions.php) e agora você está livre - obviamente. O conceito é:

  • Pegue os dados do URL,
  • Use um simples WP_Query()(se sua consulta for complexa, use $wpdbquery),
  • Passe os comandos na consulta, busque dados do banco de dados e
  • Mostrar os resultados

Uma amostra pode ser:

<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Start the Query
$v_args = array(
        'post_type'     =>  'vehicle', // your CPT
        's'             =>  $_name, // looks into everything with the keyword from your 'name field'
        '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
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);

// Show the results
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Assumed your cars' names are stored as a CPT post title
    endwhile;
else :
    _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>

Então, aqui está sua coisa final. Mas ainda existem muitos desafios:

  • Valores alternativos - uma pesquisa avançada pode ser realizada com TODOS os campos ou QUALQUER campo, para que você tenha certeza de que a Consulta está obtendo todos os resultados de acordo com a pesquisa e os dados. Você pode usar a $wpdbconsulta SQL personalizada para obter resultados de pesquisa complexos e isso será puro MySQL - o WordPress não tem nada lá.
  • Sanitização e validação - o campo e a área de texto são tão vulneráveis ​​que podem causar más práticas no seu site. Portanto, a transmissão de dados brutos seria insegura, será necessário higienizar e validá-los antes de passar para a consulta db. ( Sanitização e validação de dados com WordPress - TutsPlus )
  • Design - você pode escolher o modelo page.php(ou search.php) e criar esta página com base nisso.

Então, você entendeu a idéia, agora é a sua vez de explorar e descobrir o caminho . Lembre-se, o caminho de todo mundo é diferente. Faça o seu, para que eu possa segui-lo. :)

Mayeenul Islam
fonte
Obrigado por tomar o tempo, muito gentil da sua parte. Você sabe como eu posso tê-lo, de modo que o menu suspenso de "Makes" mostre automaticamente todas as marcas que foram inseridas em uma das postagens do veículo?
absdigital 15/10
Ficará feliz se ele funciona para você. :)
Mayeenul Islam
Você sabe como eu posso tê-lo, de modo que o menu suspenso de "Makes" mostre automaticamente todas as marcas que foram inseridas em uma das postagens do veículo?
absdigital
use WP_Query()parâmetros de campo personalizados usando e faça o loop do resultado para mostrar os <option>s.
Mayeenul Islam
Eu gostaria de ver essa "pesquisa avançada" feita usando pre_get_postsgancho e não um loop secundário.
cybmeta
23

Embora a resposta de @ MayeenulIslam possa funcionar, acho que a maneira correta de fazer uma pesquisa avançada é usando o pre_get_postsgancho de ação.

Etapa 1: Formulário de Pesquisa

Este passo igual a etapa 1 na outra resposta, apenas mudou o iddo namecampo ( <input type="text" ...>usado para pesquisa de "s" , por isso vai ser usado diretamente para o maior campo de pesquisa. Salvar este código em advanced-searchform.phpem sua pasta tema. Então, o uso get_template_part( 'advanced', 'searchform' );de carregue-o onde deseja que apareça no seu tema:

<?php /**`advanced-searchform.php`*/ ?>
<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: adicionar 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 filtrando os resultados sem a necessidade de uma consulta secundária. Se você quiser usar um modelo diferente para pesquisa avançada, poderá usar o template_includefiltro. Por exemplo, se você deseja usar o advanced-search-template.phparquivo como modelo para obter resultados no 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;
}
cybmeta
fonte
3
Muito obrigado pelo caminho do WordPress. Apenas trabalhei com este e é incrível. :)
Mayeenul Islam