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

11

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

Donc, fondamentalement, sur la page d'accueil, je veux un formulaire de recherche qui a des listes déroulantes pour Make & Model et contient toutes les marques ou modèles disponibles.

Je veux également qu'il ait 2 options pour l'année, afin que l'utilisateur final puisse sélectionner "2006" et "2012" et les résultats de la recherche contiennent tous les véhicules avec l'année entre ces deux nombres.

Existe-t-il un plugin qui peut le faire ??

Merci pour toute aide .. cela me rend fou depuis des heures !!!!

absdigital
la source
Je pense que vous pouvez utiliser ce plug-in pour vous aider à mieux wordpress.org/plugins/wp-custom-fields-search
DINESH BHIMANI
Merci .. Mais cela n'explique pas comment créer réellement le formulaire de recherche. Je veux dire que je peux programmer le formulaire en HTML, mais comment le faire fonctionner?!
absdigital

Réponses:

16

______MISE À JOUR_______
Bien que j'obtienne de plus en plus de votes, et la solution fonctionne, mais la réponse de cybmeta est en fait la réponse qui est agréable et à la manière de WordPress. Vous devriez certainement essayer ça.

Étape 1

Commencez par créer un formulaire de recherche avancée avec lequel vous souhaitez que votre utilisateur interagisse avec le site Web, et enregistrez-le avec un nom (c'est-à-dire que je l'ai enregistré sous advanced-searchform.php- mais ne l'enregistrez pas avec searchform.phpalors il remplacera le formulaire de recherche par défaut de 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>

Appelez ensuite le formulaire dans votre modèle comme suit:

<?php get_template_part( 'advanced', 'searchform' ); ?>

Maintenant, votre formulaire de recherche est prêt, et vous pouvez maintenant utiliser le formulaire de recherche et prendre la saisie de l'utilisateur dans l'URL.

Étape 2

Ce dont vous avez juste besoin est: interroger la base de données et interroger le type de publication et ses champs personnalisés selon la requête de recherche . N'oubliez pas que votre requête de recherche est désormais l'URL que vous avez obtenue après l'envoi du formulaire. Demandez maintenant à WordPress de charger votre page de résultats de recherche personnalisée lorsque le formulaire est soumis. Placez la fonction suivante dans votre functions.phpafin qu'elle active votre modèle de recherche personnalisé au lieu de la valeur par défaut 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');
?>

J'ai apporté le code quelque part de WPSE (j'ai oublié la racine), mais il y a une controverse en utilisant le code ci-dessus. Mais cela fonctionne réellement ( excuse boiteuse bien sûr ).

Cochez une autre manière suggérée par @GM.

Étape 3

Créez un nouveau fichier et enregistrez-le avec advanced-search-result.php(car nous avons utilisé ce nom dans functions.php) et maintenant vous êtes libre - évidemment. Le concept est:

  • Récupérez les données de l'URL,
  • Utilisez un simple WP_Query()(si votre requête est complexe alors utilisez la $wpdbrequête),
  • Passez les commandes dans la requête, récupérez les données de db et
  • Afficher le résultat [s]

Un échantillon peut être:

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

Alors, voici votre dernière chose. Mais il y a encore de nombreux défis:

  • Valeurs alternatives - une recherche avancée peut être effectuée avec TOUS les champs ou TOUT des champs, vous devez donc vous assurer que la requête prend tous les résultats conformément à la recherche et aux données. Vous pouvez utiliser $wpdbune requête SQL personnalisée pour des résultats de recherche complexes et ce sera purement MySQL - WordPress n'a rien là-bas.
  • Sanitization & Validation - le champ et la zone de texte des textes sont si vulnérables que cela peut entraîner de mauvaises pratiques sur votre site. Ainsi, la transmission de données brutes ne serait pas sûre, vous devrez les assainir et les valider avant de les passer dans la requête db. ( Désinfection et validation des données avec WordPress - TutsPlus )
  • Conception - vous pouvez choisir le modèle page.php(ou search.php) et créer cette page sur cette base.

Donc, vous avez l'idée, maintenant c'est à votre tour d'explorer et de découvrir le chemin . Rappelez-vous, le chemin de chacun est différent. Faites le vôtre, afin que je puisse vous suivre. :)

Mayeenul Islam
la source
Merci d'avoir pris le temps, très gentil de votre part. Savez-vous comment je peux l'avoir pour que le menu déroulant pour "Marques" affiche automatiquement toutes les marques qui ont été entrées dans l'un des messages du véhicule?
absdigital du
Sera content si cela fonctionne pour vous. :)
Mayeenul Islam
Savez-vous comment je peux l'avoir pour que le menu déroulant pour "Marques" affiche automatiquement toutes les marques qui ont été entrées dans l'un des messages du véhicule?
absdigital
utilisez un WP_Query()paramètre de champ personnalisé et bouclez le résultat pour afficher le <option>s.
Mayeenul Islam
Je voudrais voir cette "recherche avancée" effectuée à l'aide d'un pre_get_postscrochet et non d'une boucle secondaire.
cybmeta
23

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 pre_get_postscrochet d'action.

Étape 1: Formulaire de recherche

Cette étape égale à l' étape 1 dans l'autre réponse, juste changé iddu namechamp ( <input type="text" ...>utilisé pour la recherche de « s » , il sera utilisé directement pour que le champ de recherche. Enregistrer ce code dans advanced-searchform.phpsous votre dossier thématique. Ensuite, l' utilisation get_template_part( 'advanced', 'searchform' );de chargez-le où vous voulez qu'il apparaisse dans votre thème:

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

Étape 2: ajouter des 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: 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 avoir besoin d'une requête secondaire. Si vous souhaitez utiliser un modèle différent pour la recherche avancée, vous pouvez utiliser le template_includefiltre. Par exemple, si vous souhaitez utiliser le advanced-search-template.phpfichier 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;
}
cybmeta
la source
3
Merci beaucoup pour la manière de WordPress. Je viens de travailler avec celui-ci et c'est génial. :)
Mayeenul Islam