Form di ricerca avanzata con filtri per tassonomie personalizzate e campi personalizzati
Vorrei creare un form di ricerca avanzata per uno specifico custom post type, con filtri per i campi personalizzati, le tassonomie custom e per le proprietà (campi e tassonomie) di un altro custom post type che sarà collegato al primo utilizzando un campo di relazione personalizzato.
Ho recentemente iniziato a lavorare con i custom post type, i campi personalizzati e le tassonomie di WordPress, mi piace molto finora ma per sfruttarli al meglio vorrei poter effettuare ricerche in modo appropriato. Devo farlo manualmente? Se sì, come?
P.S. Se può essere utile, sto utilizzando i plugin: Advanced Custom Fields e Custom Post Type UI.
Qui sotto ho creato un esempio di come dovrebbe apparire il sistema di filtraggio e come potrebbe essere collegato ai post type sopra citati.
Penso che per qualcosa del genere sarebbe meglio scriverlo da soli.
Dai un'occhiata a: http://www.catalysthomes.co.uk/homes-for-sale/
Le proprietà vengono caricate in un CPT (Custom Post Type) e ho una mia ricerca personalizzata nella sidebar. Questa ricerca esamina diverse cose come tassonomie, campi personalizzati e ordina per data, prezzo, ecc.
Quindi, come ottengo questo risultato? Invio il modulo a un template di pagina e da lì gestisco i dati del post e costruisco una nuova WP_query in base ai criteri di ricerca. Uso le sessioni per memorizzare le variabili di ricerca così da poter paginare i risultati.
WP_Query è molto potente. Dai un'occhiata: http://codex.wordpress.org/Class_Reference/WP_Query
Puoi usare meta_query
per interrogare più campi personalizzati e tax_query
per interrogare le tue tassonomie, oltre a molto altro. Di seguito trovi come ho costruito il mio per darti un'idea.
File Template:
<?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"); ?>
Risultati Grezzi
<?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: /* Non è necessario impostare argomenti qui poiché wp query ha valori predefiniti */ break;
}
$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>
Risultati della Ricerca
<?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 della Lista Solo un loop standard di WP per mostrare estratti e informazioni dei post.

Ciao Brady, grazie per questo esempio. Potrei chiederti, se possibile, di condividere il modulo? In esso, a quale URL lo stai inviando?

@salocin - Quelle informazioni possono essere ottenute guardando il sorgente della pagina all'URL fornito nella risposta

Il modulo si trova su catalysthomes.co.uk. Puoi visualizzare il sorgente e vedere come funziona il modulo

Prova il plugin Taxonomy Picker insieme a Relevanssi. Una combinazione letale.
http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/

Dai un'occhiata al plugin Relevanssi, potrebbe fare al caso tuo: http://wordpress.org/extend/plugins/relevanssi/

Se qualcuno ha difficoltà a implementare la soluzione di Brady sopra menzionata (come è successo a me), ecco un suggerimento: sembra che WordPress abbia alcuni problemi con il passaggio dei dati di sessione, quindi probabilmente sarà necessario fare qualcosa in più per farlo funzionare correttamente. Questi problemi sono discussi qui
In functions.php:
function init_sessions() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'init_sessions');
Nel tuo template:
/**
* Abilita le sessioni
*/
if (!session_id())
session_start();
Nel mio caso, installare il plugin "Simple Session Support" di Peter Wooster ha risolto il problema.

Ciao Steve. Grazie per aver pubblicato la tua prima risposta qui. Siamo felici di averti su WPSE. Per riferimento futuro, le risposte non dovrebbero dipendere completamente da un link esterno. Se il link viene disabilitato, la tua risposta diventa inutile. Potresti aggiornare la tua risposta con un paio di frammenti di codice rilevanti come esempio?
