Création d'un formulaire de recherche pour les champs personnalisés

10

J'ai construit un thème pour un concessionnaire automobile. Chaque voiture est un type de poste personnalisé ("véhicule") et comporte environ 12 champs personnalisés avec des éléments tels que Marque, Modèle, Kilométrage, Type de carburant, etc., etc.

Donc, sur la page d’accueil, je veux un formulaire de recherche contenant des listes déroulantes pour Make & Modèle et contient toutes les marques ou modèles disponibles.

Je souhaite également disposer de 2 options pour l'année, afin que l'utilisateur final puisse sélectionner "2006" et "2012". Les résultats de la recherche contiennent tous les véhicules dont l'année se situe entre ces deux chiffres.

Existe-t-il un plugin capable de le faire?

Merci pour toute aide .. cela m’a rendu fou pendant des heures !!!!

    
posée absdigital 15.10.2014 - 14:49

2 réponses

13
  

MISE À JOUR DU

réponse donnée Mayeenul Islam 15.10.2014 - 17:45
17

Bien que la réponse de @ MayeenulIslam puisse fonctionner, je pense que la bonne façon de faire une recherche avancée consiste à utiliser le crochet pre_get_posts action.

Étape 1: formulaire de recherche

Cette étape, identique à l’étape 1 de l’autre réponse, vient de remplacer l’id du "nom" utilisé pour la recherche par "s", afin qu’il soit utilisé directement comme champ de recherche. Enregistrez ce code dans searchform-advanced.php sous votre dossier de thèmes. Ensuite, utilisez get_template_part( 'advanced', 'searchform' ); pour le charger à l'endroit où vous souhaitez qu'il apparaisse dans votre thème:

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

Étape 2: ajout de filtres à la requête de recherche

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

    }
}

Étape 3: création de modèles (facultatif)

Avec cette méthode, le modèle de recherche par défaut de WordPress sera utilisé pour filtrer les résultats sans recourir à une requête secondaire. Si vous souhaitez utiliser un autre modèle pour la recherche avancée, vous pouvez utiliser le filtre template_include . Par exemple, si vous souhaitez utiliser le fichier advanced-search-template.php comme modèle pour les résultats du formulaire de recherche avancée:

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;
}
    
réponse donnée cybmeta 02.02.2015 - 11:04

Lire d'autres questions sur les étiquettes