Creazione di un modulo di ricerca per campi personalizzati

15 ott 2014, 15:49:24
Visualizzazioni: 62K
Voti: 13

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!!!!

2
Commenti

Penso che tu possa usare questo plugin per aiutarti meglio https://wordpress.org/plugins/wp-custom-fields-search/

DINESH BHIMANI DINESH BHIMANI
15 ott 2014 16:00:28

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

absdigital absdigital
15 ott 2014 16:41:10
Tutte le risposte alla domanda 2
2
27

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;
}
2 feb 2015 12:04:16
Commenti

Grazie mille per il metodo WordPress. Ho appena lavorato con questo ed è fantastico. :)

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

Grazie. È stato d'aiuto.

Abdul Samad Abdul Samad
5 ago 2021 15:55:04
5
17

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

15 ott 2014 18:45:35
Commenti

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?

absdigital absdigital
15 ott 2014 19:00:54

Sarei felice se funzionasse per te. :)

Mayeenul Islam Mayeenul Islam
15 ott 2014 19:01:42

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?

absdigital absdigital
15 ott 2014 19:06:19

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

Mayeenul Islam Mayeenul Islam
15 ott 2014 19:06:22

Vorrei vedere questa "ricerca avanzata" implementata usando l'hook pre_get_posts e non un loop secondario.

cybmeta cybmeta
2 feb 2015 11:44:01