______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.php
alors 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.php
afin 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 $wpdb
requê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
$wpdb
une 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. :)