Creazione di un modulo di ricerca per campi personalizzati


11

Ho creato un tema per un concessionario di automobili. Ogni auto è un tipo di posta personalizzato ("veicolo") e ha circa 12 campi personalizzati con cose come Marca, Modello, Chilometraggio, Tipo di carburante ecc. Ecc.

Quindi fondamentalmente nella home page voglio un modulo di ricerca che abbia elenchi a discesa per Marca e Modello e che contenga qualsiasi Marca o Modello disponibile.

Voglio anche che abbia 2 opzioni per Anno, quindi l'utente finale può selezionare "2006" e "2012" e i risultati della ricerca contengono tutti i veicoli con l'anno tra questi due numeri.

C'è un plugin là fuori che può fare questo ??

Grazie per qualsiasi aiuto .. questo mi sta facendo impazzire da ore !!!!


Penso che puoi usare questo plug-in per aiutarti a migliorare wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI

Grazie .. Ma questo non spiega come creare effettivamente il modulo di ricerca. Voglio dire, posso programmare il modulo in HTML, ma come posso effettivamente farlo funzionare ?!
absdigital,

Risposte:


16

______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.phpquindi 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.phpmodo 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 $wpdbquery),
  • 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 $wpdbquery 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. :)


Grazie per aver dedicato del tempo, molto gentile da parte tua. Sai come posso averlo in modo che il menu a discesa per "Marche" mostrerà automaticamente tutte le marche che sono state inserite in uno dei messaggi del veicolo?
absdigital,

Sarò felice se funziona per te. :)
Mayeenul Islam,

Sai come posso averlo in modo che il menu a discesa per "Marche" mostrerà automaticamente tutte le marche che sono state inserite in uno dei messaggi del veicolo?
absdigital,

usa un WP_Query()usando i parametri del campo personalizzato e esegui il ciclo del risultato per mostrare la <option>s.
Mayeenul Islam,

Mi piacerebbe vedere questa "ricerca avanzata" fatta usando pre_get_postshook e non un loop secondario.
cybmeta,

23

Sebbene la risposta di @ MayeenulIslam possa funzionare, penso che il modo corretto di fare una ricerca avanzata sia usare l' pre_get_postshook dell'azione.

Passaggio 1: modulo di ricerca

Questo passo pari a passaggio 1 nella altra risposta, appena cambiato il iddel namecampo ( <input type="text" ...>utilizzato per la ricerca di "s" , quindi sarà utilizzato direttamente per come campo di ricerca. Salvare questo codice advanced-searchform.phpsotto la vostra cartella del tema. Quindi, l'uso get_template_part( 'advanced', 'searchform' );di caricalo 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( '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="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" 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 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

Passaggio 2: aggiungere 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', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

Step 3: Templating (opzionale)

Con questo metodo, verrà utilizzato il modello di ricerca predefinito di WordPress per filtrare i risultati senza la necessità di una query secondaria. Se si desidera utilizzare un modello diverso per la ricerca avanzata, è possibile utilizzare il template_includefiltro. Ad esempio, se si desidera utilizzare il advanced-search-template.phpfile come modello per i risultati dal modulo di 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;
}

3
Grazie mille per il modo di WordPress. Ho appena lavorato con questo ed è fantastico. :)
Mayeenul Islam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.