Crearea unui formular de căutare pentru câmpuri personalizate

15 oct. 2014, 15:49:24
Vizualizări: 62K
Voturi: 13

Am creat o temă pentru un dealer auto. Fiecare mașină este un tip de postare personalizat ("vehicle") și are aproximativ 12 câmpuri personalizate cu informații precum Marca, Model, Kilometraj, Tip Combustibil etc.

În esență, pe pagina principală doresc un formular de căutare care să aibă liste derulante pentru Marcă și Model și să conțină toate Mărcile sau Modelele disponibile.

De asemenea, vreau să aibă 2 opțiuni pentru An, astfel încât utilizatorul final să poată selecta "2006" și "2012", iar rezultatele căutării să conțină toate vehiculele cu anul cuprins între aceste două numere.

Există vreun plugin care poate face acest lucru?

Mulțumesc pentru orice ajutor... acest lucru mă înnebunește de ore întregi!!!!

2
Comentarii

Cred că poți folosi acest plugin pentru a te ajuta mai bine https://wordpress.org/plugins/wp-custom-fields-search/

DINESH BHIMANI DINESH BHIMANI
15 oct. 2014 16:00:28

Mulțumesc... Dar asta nu explică cum să creez efectiv formularul de căutare. Adică pot să programez formularul în HTML, dar cum îl fac să funcționeze efectiv?!

absdigital absdigital
15 oct. 2014 16:41:10
Toate răspunsurile la întrebare 2
2
27

Deși răspunsul lui @MayeenulIslam ar putea funcționa, cred că modul corect de a face o căutare avansată este utilizarea hook-ului de acțiune pre_get_posts.

Pasul 1: Formularul de căutare

Acest pas este similar cu pasul 1 din celălalt răspuns, doar că am schimbat id-ul câmpului name (<input type="text" ...>) folosit pentru căutare în "s", astfel încât să fie utilizat direct ca câmp de căutare. Salvați acest cod în advanced-searchform.php în folderul temei dvs. Apoi, utilizați get_template_part( 'advanced', 'searchform' ); pentru a-l încărca acolo unde doriți să apară în tema dvs.:

<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Căutare Avansată', 'textdomain' ); ?></h3>

    <!-- TRIMITEM ACESTA PENTRU A DECLANȘA PAGINA DE REZULTATE A CĂUTĂRII AVANSATE DIN functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Nume: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Introduceți Numele Mașinii', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Selectați un Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Selectați unul...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Căutare" />

</form>

Pasul 2: Adăugarea de filtre la interogarea de căutare

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // presupunând că meta_key-ul dvs. este 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // găsește modele care se potrivesc cu 'model' din câmpul select
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

Pasul 3: Șabloane (opțional)

Cu această metodă, șablonul implicit de căutare al WordPress va fi utilizat, filtrând rezultatele fără a fi nevoie de o interogare secundară. Dacă doriți să utilizați un șablon diferit pentru căutarea avansată, puteți utiliza filtrul template_include. De exemplu, dacă doriți să utilizați fișierul advanced-search-template.php ca șablon pentru rezultatele din formularul de căutare avansată:

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}
2 feb. 2015 12:04:16
Comentarii

Mulțumesc mult pentru metoda WordPress. Tocmai am lucrat cu aceasta și este minunată. :)

Mayeenul Islam Mayeenul Islam
30 apr. 2015 20:39:20

Mulțumesc. A fost de ajutor.

Abdul Samad Abdul Samad
5 aug. 2021 15:55:04
5
17

______ACTUALIZARE_______
Deși primesc din ce în ce mai multe voturi, iar soluția funcționează, răspunsul lui cybmeta este de fapt soluția elegantă și în stilul WordPress. Ar trebui să încerci cu siguranță aceasta.

Pasul 1

Începe prin a crea un Formular Avansat de Căutare cu care utilizatorii tăi vor interacționa pe site și salvează-l cu un nume (de exemplu, l-am salvat ca advanced-searchform.php — dar nu îl salva ca searchform.php pentru că va înlocui formularul implicit de căutare din WordPress):

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Căutare Avansată', 'textdomain' ); ?></h3>

    <!-- TRANSMITEM ACESTA PENTRU A DECLANȘA PAGINA DE REZULTATE AVANSATE DIN functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="name" class=""><?php _e( 'Nume: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Introduceți Numele Mașinii', 'textdomain' ); ?>" name="name" id="name" />

    <label for="model" class=""><?php _e( 'Selectați un Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Selectați unul...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Căutare" />

</form>

Apoi apelează formularul în șablonul tău astfel:

<?php get_template_part( 'advanced', 'searchform' ); ?>

Acum formularul tău de căutare este gata și poți primi date de la utilizator prin URL.

Pasul 2

Tot ce trebuie să faci este: să interoghezi baza de date și să cauți în tipul de postare și câmpurile personalizate în funcție de interogarea de căutare. Amintește-ți că interogarea ta este acum URL-ul obținut după trimiterea formularului. Acum instruiește WordPress să încarce pagina ta personalizată de rezultate atunci când formularul este trimis. Pune următoarea funcție în fișierul tău functions.php pentru a activa șablonul personalizat în locul celui implicit search.php:

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

Am preluat codul de undeva de pe WPSE (am uitat sursa exactă), dar există controverse privind utilizarea acestui cod. Totuși, funcționează (scuză slabă, desigur).

Verifică altă metodă sugerată de @G.M.

Pasul 3

Creează un fișier nou și salvează-l ca advanced-search-result.php (pentru că am folosit acest nume în functions.php) și acum ești liber - evident. Conceptul este:

  • Preia datele din URL,
  • Folosește un simplu WP_Query() (dacă interogarea ta este complexă, folosește o interogare $wpdb),
  • Transmite comenzile în interogare, preia datele din baza de date și
  • Afișează rezultatul/rezultatele

Un exemplu poate fi:

<?php
// Preia datele din URL în variabile
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Începe interogarea
$v_args = array(
        'post_type'     =>  'vehicle', // CPT-ul tău
        's'             =>  $_name, // caută în tot ce conține cuvântul cheie din 'câmpul nume'
        'meta_query'    =>  array(
                                array(
                                    'key'     => 'car_model', // presupunem că meta_key este 'car_model'
                                    'value'   => $_model,
                                    'compare' => 'LIKE', // găsește modele care se potrivesc cu 'model' din câmpul select
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Descomentează această linie pentru a vedea ce interogare a rulat WP
// var_dump($vehicleSearchQuery->request);

// Afișează rezultatele
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Presupunem că numele mașinilor sunt stocate ca titlu al postării CPT
    endwhile;
else :
    _e( 'Ne pare rău, nu s-a găsit nimic care să corespundă criteriilor tale', 'textdomain' );
endif;
wp_reset_postdata();
?>

Deci, aceasta este soluția ta finală. Dar încă există multe provocări:

  • Valori Alternative - o căutare avansată poate fi efectuată cu TOATE câmpurile sau ORICE câmp, așa că trebuie să te asiguri că interogarea ia în considerare toate rezultatele în funcție de căutare și date. Poți folosi o interogare SQL personalizată $wpdb pentru căutări complexe și aceasta va fi MySQL pur - WordPress nu are nicio contribuție acolo.
  • Sanitizare & Validare - câmpurile de text și textarea sunt atât de vulnerabile încât pot cauza probleme site-ului tău. Deci, transmiterea datelor în format brut ar fi nesigură, va trebui să le sanitizezi și validezi înainte de a le transmite în interogarea bazei de date. (Sanitizarea și Validarea Datelor în WordPress - TutsPlus)
  • Proiectare - poți alege șablonul page.php (sau search.php) și să creezi această pagină pe baza lui.

Deci, ai înțeles ideea, acum e rândul tău să explorezi și să descoperi calea. Amintește-ți, fiecare are propria cale. Fă-ți a ta, ca să te pot urma. :)

15 oct. 2014 18:45:35
Comentarii

Vă mulțumim pentru timpul acordat, foarte amabil din partea dumneavoastră. Știți cum aș putea face ca meniul derulant pentru "Mărci" să afișeze automat orice marcă introdusă într-unul dintre postările despre vehicule?

absdigital absdigital
15 oct. 2014 19:00:54

Voi fi bucuros dacă funcționează pentru dumneavoastră. :)

Mayeenul Islam Mayeenul Islam
15 oct. 2014 19:01:42

Știți cum aș putea face ca meniul derulant pentru "Mărci" să afișeze automat orice marcă introdusă într-unul dintre postările despre vehicule?

absdigital absdigital
15 oct. 2014 19:06:19

folosește un WP_Query() cu parametri pentru câmpuri personalizate și parcurge rezultatul pentru a afișa <option>-urile.

Mayeenul Islam Mayeenul Islam
15 oct. 2014 19:06:22

aș dori să văd această "căutare avansată" făcută folosind hook-ul pre_get_posts și nu o buclă secundară.

cybmeta cybmeta
2 feb. 2015 11:44:01