M é m o - l a b .
Ce chapitre décrit comment intégrer facilement un formulaire permettant de rechercher des articles ou des cpt.
Notions abordées : get_search_form(), the_search_query(), pre_get_posts(), is_main_query(), is_search().
Le template searchform.php
intègre le code affichant le formulaire de recherche. Il doit être placé à la racine du thème.
La fonction get_search_form()
nous permet d’appeler ce template.
Le template search.php
intègre le code affichant le résultat de la recherche. Il doit être placé à la racine du thème.
La compréhension par le code
Cas simple d'un formulaire ciblant sa recherche aux articles (type de contenu 'post').
<!-- Fichier <nom_du_theme>/searchform.php -->
<form action="<?php echo esc_url(home_url('/')); ?>" method="get">
<input type="text" name="s" value="<?php the_search_query(); ?>">
<input type="submit" value="Rechercher">
</form>
<!-- Fichier <nom_du_theme>/search.php -->
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
<?php endwhile; endif; ?>
Affecter l'ensemble des formulaires à la recherche d'un type de contenu (post ou cpt).
Les noms des cpt seront appelés cpt1 et cpt2 dans les exemples suivants.
<?php
// Fichier <nom_du_theme>/function.php
function mytheme_filter_search($query) {
// Condition ciblant les requêtes de recherche frontend
if (!is_admin() && $query->is_main_query() && $query->is_search()) {
$query->set('post_type', array('post', 'cpt1', 'cpt2'));
}
return $query;
}
add_filter('pre_get_posts', 'mytheme_filter_search');
?>
Affecter un formulaire à la recherche d’un cpt
<!-- Dans un template -->
<form action="<?php echo home_url(); ?>" method="get">
<input type="text" name="s" value="<?php the_search_query(); ?>">
<input type="hidden" value="cpt1" name="post_type" id="post_type" />
<input type="submit" value="Rechercher">
</form>
Affecter un formulaire à la recherche de plusieurs cpt
<!-- Dans un template -->
<form action="<?php echo home_url(); ?>" method="get">
<input type="text" name="s" value="<?php the_search_query(); ?>">
<input type="hidden" value="define_posts" name="post_type" id="post_type" />
<input type="submit" value="Rechercher">
</form>
<?php
// Dans functions.php
function mytheme_filter_search($query) {
// Condition ciblant les requêtes de recherche frontend
if (!is_admin() && $query->is_main_query() && $query->is_search()) {
if ($_GET['post_type'] == 'recette_post') {
$query->set('post_type', array('recette', ‘post’));
}
}
return $query;
}
add_filter('pre_get_posts', 'mytheme_filter_search');
?>