Creazione di un modulo di ricerca per campi personalizzati
Ho sviluppato un tema per un concessionario auto. Ogni auto è un tipo di post personalizzato ("vehicle"), e ha circa 12 campi personalizzati con informazioni come Marca, Modello, Chilometraggio, Tipo di Carburante ecc.
In pratica, sulla homepage vorrei un modulo di ricerca che abbia menu a tendina per Marca e Modello e contenga tutte le Marche e i Modelli disponibili.
Vorrei anche avere 2 opzioni per l'Anno, così l'utente finale può selezionare "2006" e "2012" e i risultati della ricerca mostrino tutti i veicoli con anno compreso tra questi due numeri.
Esiste un plugin che possa fare questo?
Grazie per qualsiasi aiuto... questo problema mi sta facendo impazzire da ore!!!!

Sebbene la risposta di @MayeenulIslam potrebbe funzionare, penso che il modo corretto per effettuare una ricerca avanzata sia utilizzare l'hook di azione pre_get_posts
.
Passo 1: Modulo di Ricerca
Questo passo è uguale al passo 1 nell'altra risposta, ho solo cambiato l'id
del campo name
(<input type="text" ...>
) usato per la ricerca in "s", così verrà utilizzato direttamente come campo di ricerca.
Salva questo codice in advanced-searchform.php
nella cartella del tuo tema. Poi, usa get_template_part( 'advanced', 'searchform' );
per caricarlo dove vuoi che appaia nel tuo tema:
<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<h3><?php _e( 'Ricerca Avanzata', 'textdomain' ); ?></h3>
<!-- PASSANDO QUESTO PER ATTIVARE LA PAGINA DEI RISULTATI DI RICERCA AVANZATA DA functions.php -->
<input type="hidden" name="search" value="advanced">
<label for="s" class=""><?php _e( 'Nome: ', 'textdomain' ); ?></label><br>
<input type="text" value="" placeholder="<?php _e( 'Digita il Nome della Macchina', 'textdomain' ); ?>" name="s" id="name" />
<label for="model" class=""><?php _e( 'Seleziona un Modello: ', 'textdomain' ); ?></label><br>
<select name="model" id="model">
<option value=""><?php _e( 'Seleziona uno...', 'textdomain' ); ?></option>
<option value="model1"><?php _e( 'Modello 1', 'textdomain' ); ?></option>
<option value="model2"><?php _e( 'Modello 2', 'textdomain' ); ?></option>
</select>
<input type="submit" id="searchsubmit" value="Cerca" />
</form>
Passo 2: Aggiungi filtri alla query di ricerca
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', // assumendo che la tua meta_key sia 'car_model'
'value' => $_model,
'compare' => 'LIKE', // trova i modelli che corrispondono a 'model' dal campo select
)
)
);
$query->set( 'meta_query', $meta_query );
}
}
Passo 3: Templating (opzionale)
Con questo metodo, verrà utilizzato il template di ricerca predefinito di WordPress filtrando i risultati senza la necessità di una query secondaria. Se vuoi usare un template diverso per la ricerca avanzata, puoi usare il filtro template_include
. Per esempio, se vuoi usare il file advanced-search-template.php
come template per i risultati della ricerca avanzata:
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;
}

______AGGIORNAMENTO_______
Nonostante stia ricevendo sempre più voti e la soluzione funzioni, la risposta di cybmeta è in realtà la risposta corretta e in linea con lo stile WordPress. Dovresti assolutamente provarla.
Passo 1
Inizia creando un Modulo di Ricerca Avanzata con cui l'utente interagirà con il sito web, e salvalo con un nome (ad esempio, l'ho salvato come advanced-searchform.php
— ma non salvarlo come searchform.php
altrimenti sostituirà il modulo di ricerca predefinito di WordPress):
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<h3><?php _e( 'Ricerca Avanzata', 'textdomain' ); ?></h3>
<!-- PASSIAMO QUESTO PER ATTIVARE LA PAGINA DEI RISULTATI DI RICERCA AVANZATA DA functions.php -->
<input type="hidden" name="search" value="advanced">
<label for="name" class=""><?php _e( 'Nome: ', 'textdomain' ); ?></label><br>
<input type="text" value="" placeholder="<?php _e( 'Digita il Nome dell\'Auto', 'textdomain' ); ?>" name="name" id="name" />
<label for="model" class=""><?php _e( 'Seleziona un Modello: ', 'textdomain' ); ?></label><br>
<select name="model" id="model">
<option value=""><?php _e( 'Seleziona uno...', 'textdomain' ); ?></option>
<option value="model1"><?php _e( 'Modello 1', 'textdomain' ); ?></option>
<option value="model2"><?php _e( 'Modello 1', 'textdomain' ); ?></option>
</select>
<input type="submit" id="searchsubmit" value="Cerca" />
</form>
Poi richiama il modulo nel tuo template come segue:
<?php get_template_part( 'advanced', 'searchform' ); ?>
Ora il tuo modulo di ricerca è pronto e puoi usarlo per raccogliere gli input degli utenti nell'URL.
Passo 2
Quello che ti serve ora è: interrogare il database e cercare nel post type e nei suoi custom field in base alla query di ricerca. Ricorda che la tua query di ricerca è ora l'URL ottenuto dopo l'invio del modulo. Ora chiedi a WordPress di caricare la tua pagina personalizzata dei risultati quando il modulo viene inviato. Inserisci la seguente funzione nel tuo functions.php
in modo che abiliti il tuo template di ricerca personalizzato invece del default 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');
?>
Ho preso questo codice da WPSE (ho dimenticato la fonte), ma ci sono controversie sull'uso di questo codice. Tuttavia funziona (scusa debole ovviamente).
Controlla un altro metodo suggerito da @G.M.
Passo 3
Crea un nuovo file e salvalo come advanced-search-result.php
(perché abbiamo usato questo nome in functions.php
) e ora sei libero - ovviamente. Il concetto è:
- Prendi i dati dall'URL,
- Usa una semplice
WP_Query()
(se la tua query è complessa usa una query$wpdb
), - Passa i comandi nella query, recupera i dati dal db, e
- Mostra i risultati
Un esempio può essere:
<?php
// Ottieni i dati dall'URL nelle variabili
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';
// Inizia la Query
$v_args = array(
'post_type' => 'vehicle', // il tuo CPT
's' => $_name, // cerca in tutto con la parola chiave dal tuo 'campo nome'
'meta_query' => array(
array(
'key' => 'car_model', // assumiamo che il tuo meta_key sia 'car_model'
'value' => $_model,
'compare' => 'LIKE', // trova modelli che corrispondono a 'model' dal campo select
),
)
);
$vehicleSearchQuery = new WP_Query( $v_args );
// Apri questa riga per Debuggare la query eseguita da WP
// var_dump($vehicleSearchQuery->request);
// Mostra i risultati
if( $vehicleSearchQuery->have_posts() ) :
while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
the_title(); // Assumiamo che i nomi delle auto siano memorizzati come titolo del post CPT
endwhile;
else :
_e( 'Spiacenti, nessun risultato corrisponde ai criteri di ricerca', 'textdomain' );
endif;
wp_reset_postdata();
?>
Quindi, ecco il risultato finale. Ma ci sono ancora molte sfide:
- Valori Alternativi - una ricerca avanzata può essere eseguita con TUTTI i campi o QUALUNQUE dei campi, quindi devi assicurarti che la Query prenda tutti i risultati in base alla ricerca e ai dati. Puoi usare una query SQL personalizzata
$wpdb
per ricerche complesse e sarà puro MySQL - WordPress non c'entra. - Sanificazione & Validazione - i campi di testo e le textarea sono così vulnerabili da poter causare problemi al tuo sito. Quindi passare dati grezzi sarebbe insicuro, dovrai Sanificarli e Validarli prima di passarli nella query del db. (Sanificazione e Validazione dei Dati con WordPress - TutsPlus)
- Progettazione - puoi scegliere il template
page.php
(osearch.php
) e creare questa pagina sulla base di quello.
Quindi, hai capito l'idea, ora tocca a te esplorare e scoprire la tua strada. Ricorda, ognuno ha la sua strada. Crea la tua, così potrò seguirti. :)

Grazie per aver dedicato del tempo, molto gentile da parte tua. Sai come posso fare in modo che il menu a discesa per "Marca" mostri automaticamente tutte le marche che sono state inserite in uno dei post dei veicoli?

Sai come posso fare in modo che il menu a discesa per "Marca" mostri automaticamente tutte le marche che sono state inserite in uno dei post dei veicoli?

usa una WP_Query()
con parametri di campi personalizzati e cicla il risultato per mostrare le <option>
.
