ti-enxame.com

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

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 separados (campos e taxonomias) que serão links para o primeiro post tipo usando um campo de relacionamento personalizado.

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

PS. Se for importante, estou usando os plugins: Advanced Custom Fields e Custom Post Type UI .

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

wordpress custom search form filtered by custom fields and custom taxonomies

30
pax

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

Dê uma olhada em: http://www.catalysthomes.co.uk/homes-for-sale/

Propriedades são carregadas em um CPT e eu tenho minha própria pesquisa personalizada na barra lateral. Dessa pesquisa, pesquisar várias coisas, como taxonomias, campos personalizados e ordenação por data, etc.

Então, como eu faço isso? Enviei 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: http://codex.wordpress.org/Class_Reference/WP_Query

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 idéia.

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 padrãoWP para mostrar trechos e informações do post.

16
Brady

Tente o plugin Taxonomy Picker together com Relevanssi. Combinação de assassinos.

http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/

2
Hexagon

Dê uma olhada no plugin Relevanssi, ele pode fazer o que você está procurando: http://wordpress.org/extend/plugins/relevanssi/ ​​

0
Jens Wedin

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 fazer 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');

Em seu modelo:

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

Para mim, instalar o plugin " Simple Session Support " de Peter Wooster fez o truque.

0
SteveR