Crearea unui formular de căutare pentru câmpuri personalizate
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!!!!

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;
}

______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
(sausearch.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. :)

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?

Ș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?

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