Formular avansat de căutare cu filtre pentru taxonomii personalizate și câmpuri personalizate
Doresc să construiesc un formular avansat de căutare pentru un anumit tip de postare personalizată, având filtre pentru câmpurile personalizate, taxonomiile personalizate și pentru proprietățile unui alt tip de postare personalizată (câmpuri și taxonomii) care vor fi conectate cu primul tip de postare folosind un câmp de relație personalizat.
Am început recent să lucrez cu tipurile de postări personalizate, câmpuri și taxonomii în WordPress, îmi place până acum, dar pentru a le folosi la maximum aș dori să pot efectua căutări în mod corespunzător. Trebuie să fac acest lucru manual? Dacă da, cum?
PS. Dacă este relevant, folosesc plugin-urile: Advanced Custom Fields și Custom Post Type UI.
Mai jos am creat un exemplu despre cum ar arăta filtrarea și cum s-ar putea raporta la tipurile de postări menționate mai sus.
Cred că ceva de genul acesta ar fi mai bine să-l scrii tu însuți.
Aruncă o privire la: http://www.catalysthomes.co.uk/homes-for-sale/
Proprietățile sunt încărcate într-un CPT (Custom Post Type) și am propriul meu motor de căutare personalizat în bara laterală. Din această căutare, se caută mai multe lucruri, cum ar fi taxonomii, câmpuri personalizate și se ordonează după dată, preț etc.
Deci, cum realizez asta? Trimit formularul către un șablon de pagină și de acolo mă ocup de datele postate și construiesc o nouă interogare WP_query pe baza criteriilor de căutare. Folosesc sesiuni pentru a stoca variabilele de căutare, astfel încât să pot pagina rezultatele.
WP_Query este foarte puternic. Aruncă o privire: http://codex.wordpress.org/Class_Reference/WP_Query
Acolo poți folosi meta_query
pentru a interoga mai multe câmpuri personalizate și tax_query
pentru a interoga taxonomiile tale, plus multe altele. Mai jos este cum este construită a mea pentru a-ți face o idee.
Fișier șablon:
<?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"); ?>
Rezultate brute
<?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: /* Nu este nevoie să setăm argumente aici deoarece wp query are valorile implicite */ break;
}
$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>
Rezultatele căutării
<?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'
);
?>
Aspectul listei
Doar o buclă standard WP pentru a afișa extrasele postărilor și informații.

Salut Brady, Mulțumesc pentru acest exemplu. Aș putea să te întreb, dacă este posibil, să împărtășești formularul? În el, către ce URL trimiteți datele?

@salocin - Această informație poate fi obținută uitându-te la sursa paginii din URL-ul dat în răspuns

Formularul se află pe catalysthomes.co.uk. Puteți vizualiza codul sursă și vedea cum funcționează formularul

Încearcă pluginul Taxonomy Picker împreună cu Relevanssi. O combinație letală.
http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/

Aruncă un ochi pe pluginul Relevanssi, s-ar putea să facă exact ce cauți: http://wordpress.org/extend/plugins/relevanssi/

Dacă cineva întâmpină dificultăți în implementarea soluției lui Brady menționată mai sus (așa cum am pățit și eu), iată un indiciu: Se pare că WordPress are unele probleme cu transmiterea datelor de sesiune, așa că probabil va trebui să faceți ceva în plus pentru a funcționa corect. Problemele sunt discutate aici.
În fișierul functions.php:
function init_sessions() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'init_sessions');
În template-ul tău:
/**
* Activează sesiunile
*/
if (!session_id())
session_start();
Pentru mine, instalarea plugin-ului "Simple Session Support" al lui Peter Wooster a rezolvat problema.

Salut Steve. Mulțumim pentru primul tău răspuns postat aici. Mă bucur că ești pe WPSE. Pentru referințe viitoare, răspunsurile nu ar trebui să se bazeze complet pe un link extern. Dacă link-ul devine inactiv, răspunsul tău devine inutil. Ai putea, te rog, să actualizezi răspunsul tău cu câteva fragmente de cod relevante ca exemplu?
