Formular avansat de căutare cu filtre pentru taxonomii personalizate și câmpuri personalizate

9 ian. 2012, 18:23:57
Vizualizări: 71.3K
Voturi: 32

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.

formular personalizat de căutare wordpress filtrat după câmpuri personalizate și taxonomii personalizate

1
Comentarii

Dacă cineva întâmpină dificultăți în implementarea soluției lui Brady de 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: http://www.frank-verhoeven.com/using-session-in-wordpress/ Pentru mine, instalarea plugin-ului "Simple Session Support" al lui Peter Wooster a rezolvat problema. Există un link către plugin în secțiunea de comentarii a postării.

SteveR SteveR
15 sept. 2012 01:43:31
Toate răspunsurile la întrebare 4
5
16

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.

10 feb. 2012 16:41:22
Comentarii

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 salocin
28 iun. 2012 10:46:23

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

Scott Scott
28 iun. 2012 11:06:50

mersi Brady, deci URL-ul șablonului de pagină?

salocin salocin
28 iun. 2012 14:49:23

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

Scott Scott
28 iun. 2012 16:15:37

Verificați dacă taxonomiile personalizate au articole asociate ca câmpuri personalizate? Cum anume populați formularul de căutare? @Brady mulțumesc

Phil Hudson Phil Hudson
19 feb. 2016 08:00:56
1

Î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/

11 ian. 2012 10:54:36
Comentarii

acest lucru nu ia în considerare relațiile dintre postări, care reprezintă partea dificilă a problemei mele. Este mult mai ușor să filtrezi postările după taxonomie, eu am nevoie să le filtrez după taxonomia (sau câmpul personalizat) al unei postări înrudite.

pax pax
14 ian. 2012 19:09:33
1

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

10 ian. 2012 08:26:56
Comentarii

Nu se potrivește cu abordarea de care am nevoie (cu filtre specifice), dar este un plugin foarte interesant, pare o înlocuire excelentă pentru funcția de căutare implicită, mulțumesc mult pentru sugestie.

pax pax
10 ian. 2012 19:37:23
1

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.

15 sept. 2012 01:43:31
Comentarii

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?

Brian Fegter Brian Fegter
16 sept. 2012 07:09:38