Formulário de pesquisa avançada com filtros para taxonomias personalizadas e campos personalizados

28

Gostaria de criar um formulário de pesquisa avançada para um tipo de postagem personalizado específico, com filtros para os campos personalizados de tipos de postagem personalizados, taxonomias personalizadas e para propriedades de tipos de postagem personalizados (campos e taxonomias) que serão links para o primeiro tipo de postagem usando um campo de relacionamento personalizado.

Comecei recentemente com tipos de postagens personalizadas, campos e taxonomias do WPs, até agora eu adoro fazer isso, mas gostaria de poder pesquisá-lo corretamente. Preciso fazer isso manualmente? Se sim, como?

PS. Se for importante, estou usando os plugins: Campos personalizados avançados e Uma interface do tipo de postagem personalizada .

Abaixo, eu zombei de um exemplo de como a filtragem ficaria e de como ela poderia se relacionar com os tipos de postagem acima.

    
por pax 09.01.2012 / 17:23
fonte

4 respostas

16

Eu acho que algo assim seria melhor você mesmo escrever.

Dê uma olhada: enlace

As propriedades são carregadas em um CPT e eu tenho minha própria pesquisa personalizada na barra lateral. Dessa pesquisa, pesquisando uma série de coisas, como taxonomias, campos personalizados e ordenação por data de preço etc.

Então, como eu faço isso? Eu envio o formulário para um modelo de página e, a partir daí, lidei com os dados da postagem e criei uma nova WP_query com base nos critérios de pesquisa. Eu uso sessões para armazenar as variáveis de pesquisa para que eu possa paginar os resultados.

WP_Query é muito poderoso. Dê uma olhada: enlace

Lá você pode usar meta_query para consultar vários campos personalizados e usar tax_query para consultar suas taxonomias, e ainda há mais. Abaixo está como o meu é construído para lhe dar uma ideia.

Arquivo de modelo:

  <?php
  $temp = $wp_query;
  $wp_query = NULL;
  $args = array();
  ?>

  <?php include("functions/Homes-for-sale/propertyrawresults.php"); ?>
  <?php include("functions/Homes-for-sale/propertysearchresults.php"); ?>

  <?php
  $args['post_type'] = "homes-for-sale";
  $args['showposts'] = 10;
  $args['paged'] = $paged;
  $wp_query = new WP_Query($args);
  ?>

  <?php include("functions/Homes-for-sale/propertylistlayout.php"); ?>

Resultados brutos

<?php
if($_POST['sortby']) {
    $_SESSION['prop_selectedsortby'] = $_POST['sortby'];
}

switch($_SESSION['prop_selectedsortby']) {
    case "name-asc": $args['order'] = "ASC"; $args['orderby'] = "title"; break;
    case "name-desc": $args['orderby'] = "title"; break;
    case "price-asc": $args['order'] = "ASC"; $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "price-desc": $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "date-asc": $args['order'] = "ASC"; break;
    default: /* No need to set arguments here as wp query defaults */ break;
}

$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>

Resultados da pesquisa

<?php
if( ! empty( $_SESSION['s_property_ptype'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_types_nbrs',
        'value' => $_SESSION['s_property_ptype']
    );
}

if( ! empty( $_SESSION['s_property_development'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_ofdevelopment',
        'value' => $_SESSION['s_property_development']
    );
}

if( isset( $_SESSION['s_property_area'] ) && 0 != $_SESSION['s_property_area'] ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'areas',
        'field' => 'id',
        'terms' => array( (int) $_SESSION['s_property_area'] ),
    );
}

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_min_price'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_max_price'],
    'compare' => '<=',
    'type' => 'SIGNED'
);
?>

Layout da lista Apenas um loop WP padrão para mostrar trechos e informações do post.

    
por Brady 10.02.2012 / 15:41
fonte
2

Tente o plugin do Taxonomy Picker juntos com o Relevanssi. Combinação assassina.

enlace http://wordpress.org/extend/plugins/relevanssi/

    
por Hexagon 11.01.2012 / 09:54
fonte
0

Dê uma olhada no plug-in Relevanssi, ele pode fazer o que você está procurando: enlace

    
por Jens Wedin 10.01.2012 / 07:26
fonte
0

Se alguém está tendo dificuldade em implementar a solução de Brady acima (como eu fiz), aqui vai uma dica: Parece que o WordPress tem alguns problemas com a passagem de dados da sessão, então você provavelmente terá que fazer algo extra para funcionar corretamente. As questões são discutidas aqui

Em functions.php:

function init_sessions() {
  if (!session_id()) {
  session_start();
 }
}
add_action('init', 'init_sessions');

No seu modelo:

/**
* Enable sessions
*/
if (!session_id())
session_start();

Para mim, o plug-in " Suporte simples à sessão " de Peter Wooster funcionou.

    
por SteveR 15.09.2012 / 00:43
fonte