______UPDATE_______
Anche se sto ottenendo sempre più voti e la soluzione funziona, ma la risposta di cybmeta è in realtà la risposta che è simpatica e alla maniera di WordPress. Dovresti assolutamente provarlo.
Passo 1
Inizia creando un modulo di ricerca avanzata con il quale desideri che l'utente interagisca con il sito Web e lo salvi con un nome (ovvero l'ho salvato come advanced-searchform.php
- ma non salvarlo con, searchform.php
quindi 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( 'Advanced Search', 'textdomain' ); ?></h3>
<!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
<input type="hidden" name="search" value="advanced">
<label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
<input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />
<label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
<select name="model" id="model">
<option value=""><?php _e( 'Select one...', '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="Search" />
</form>
Quindi chiama il modulo nel modello come segue:
<?php get_template_part( 'advanced', 'searchform' ); ?>
Ora il tuo modulo di ricerca è pronto e ora puoi utilizzare il modulo di ricerca e puoi inserire l'input dell'utente nell'URL.
Passo 2
Ciò di cui hai solo bisogno è: interrogare il database e interrogare il tipo di post e i suoi campi personalizzati secondo la query di ricerca . Ricorda che la tua query di ricerca è ora l'URL che hai ricevuto dopo l'invio del modulo. Ora chiedi a WordPress di caricare la pagina dei risultati di ricerca personalizzata quando viene inviato il modulo. Inserisci la seguente funzione nella tua in functions.php
modo che abiliti il tuo modello di ricerca personalizzato anziché quello predefinito 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 portato il codice da qualche parte da WPSE (ho dimenticato il root), ma ci sono polemiche usando il codice sopra. Ma in realtà funziona ( scusa ovviamente ).
Controlla un altro modo suggerito da @GM.
Passaggio 3
Crea un nuovo file e salvalo con 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 un semplice
WP_Query()
(se la tua query è complessa, usa $wpdb
query),
- Passa i comandi all'interno della query, recupera i dati da db e
- Mostra il risultato [s]
Un campione può essere:
<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';
// Start the Query
$v_args = array(
'post_type' => 'vehicle', // your CPT
's' => $_name, // looks into everything with the keyword from your 'name field'
'meta_query' => array(
array(
'key' => 'car_model', // assumed your meta_key is 'car_model'
'value' => $_model,
'compare' => 'LIKE', // finds models that matches 'model' from the select field
),
)
);
$vehicleSearchQuery = new WP_Query( $v_args );
// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);
// Show the results
if( $vehicleSearchQuery->have_posts() ) :
while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
the_title(); // Assumed your cars' names are stored as a CPT post title
endwhile;
else :
_e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>
Quindi, ecco la tua ultima cosa. Ma ci sono ancora molte sfide:
- Valori alternativi : è possibile eseguire una ricerca avanzata con TUTTI i campi o QUALSIASI campo, quindi è necessario assicurarsi che la query stia prendendo tutti i risultati come da ricerca e dati. Puoi utilizzare la
$wpdb
query SQL personalizzata per risultati di ricerca complessi e questo sarà puro MySQL - WordPress non ha nulla lì.
- Disinfezione e convalida : il campo dei testi e l'area di testo sono così vulnerabili che possono causare cattive pratiche al sito. Pertanto, il passaggio di dati non elaborati non è sicuro, sarà necessario disinfettarli e convalidarli prima di passare alla query db. ( Disinfezione e convalida dei dati con WordPress - TutsPlus )
- Progettazione : puoi scegliere il modello
page.php
(o search.php
) e creare questa pagina sulla base di ciò.
Quindi, hai avuto l'idea, ora tocca a te esplorare e scoprire la strada . Ricorda, il modo di ognuno è diverso. Crea il tuo, in modo che io possa seguirti. :)