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


30

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

Recentemente, comecei com tipos, campos e taxonomias personalizados de WPs, eu amo isso até agora, mas para fazer o melhor possível, gostaria de poder pesquisá-lo adequadamente. Preciso fazer isso manualmente? Se sim, como?

PS. Se isso for importante, estou usando os plug-ins: campos personalizados avançados e interface do usuário de tipo de postagem personalizada .

Abaixo, criei um exemplo de como seria a filtragem e como ela poderia se relacionar com os tipos de postagem acima.

formulário de pesquisa personalizado do wordpress filtrado por campos personalizados e taxonomias personalizadas


Se alguém está tendo dificuldades para implementar a solução de Brady acima (como eu fiz), aqui está uma dica: Parece que o Wordpress tem alguns problemas com a transmissão de dados da sessão, então você provavelmente terá que fazer algo extra para fazê-la funcionar corretamente. Os problemas são discutidos aqui: frank-verhoeven.com/using-session-in-wordpress Para mim, a instalação do plug-in "Simple Session Support" de Peter Wooster fez o truque. Há um link para o plug-in na seção de comentários da postagem.
STEVER

Respostas:


16

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

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

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

Então, como faço para conseguir isso? Submeto o formulário a um modelo de página e, a partir daí, trato dos dados da postagem e construo um novo WP_query com base nos critérios de pesquisa. 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_querypara consultar vários campos personalizados e usar tax_querypara consultar suas taxonomias, além de 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\"";
?>

Procurar Resultados

<?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 da postagem.


Oi Brady, Thx para este exemplo. Posso pedir-lhe, se possível, que compartilhe o formulário? Nele, para qual URL você está enviando?
salocin

@salocin - É possível obter essas informações consultando a fonte da página no URL fornecido, em resposta
Brady

thx Brady, então URL do modelo de página?
salocin

O formulário está em catalysthomes.co.uk. Você pode ver fonte e ver como a forma funciona
Brady

Você verifica se as taxonomias personalizadas têm postagens com eles como um campo personalizado? Como exatamente você está preenchendo o formulário de pesquisa? @Brady thanks
Phil Hudson

2

Experimente o plugin Taxonomy Picker junto com Relevanssi. Combinação assassina.

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


isso não leva em consideração os relacionamentos entre as postagens, sendo essa a parte difícil do meu problema. É muito mais fácil filtrar postagens por taxonomia, preciso filtrá-las para comprar a taxonomia (ou campo personalizado) de uma postagem relacionada.
pax

0

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


Não se adequa à abordagem que eu preciso (com filtros específicos), mas é um plugin muito interessante, parece um ótimo substituto para a função de pesquisa padrão, muito obrigado por apontá-la.
pax

0

Se alguém está tendo dificuldades para implementar a solução de Brady acima (como eu fiz), aqui está uma dica: parece que o WordPress tem alguns problemas com a transmissão de dados da sessão, então você provavelmente terá que fazer algo extra para fazê-lo funcionar corretamente. Os problemas são discutidos 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, a instalação do plug-in " Simple Session Support " de Peter Wooster fez o truque.


11
Olá Steve. Obrigado por postar sua primeira resposta aqui. Fico feliz em tê-lo na WPSE. Para referência futura, as respostas não devem girar completamente em um link externo. Se o link estiver desativado, sua resposta se tornará benigna. Você se importaria de atualizar sua resposta com alguns exemplos de trechos de código relevantes?
Brian Fegter 16/09/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.