Mémos

M é m o - l a b .

Moteur de recherche

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