Voici ce que j'ai essayé et obtenu une solution en 3 étapes. Disons que votre type de message personnalisé est " produits "
1 . Ajouter un code de fonction ici, vous pouvez spécifier le fichier archive-search.php
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( $wp_query->is_search && $post_type == 'products' )
{
return locate_template('archive-search.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'template_chooser');
2 Créer un modèle de résultat de recherche pour un type d'article personnalisé (archive-search.php)
<?php
/* Template Name: Custom Search */
get_header(); ?>
<div class="contentarea">
<div id="content" class="content_right">
<h3>Search Result for : <?php echo "$s"; ?> </h3>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div id="post-<?php the_ID(); ?>" class="posts">
<article>
<h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
<p><?php the_exerpt(); ?></p>
<p align="right"><a href="<?php the_permalink(); ?>">Read More</a></p>
<span class="post-meta"> Post By <?php the_author(); ?>
| Date : <?php echo date('j F Y'); ?></span>
</article><!-- #post -->
</div>
<?php endwhile; ?>
<?php endif; ?>
</div><!-- content -->
</div><!-- contentarea -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Créer un formulaire de recherche
Dans ce formulaire de recherche, la valeur "produits" est masquée et seuls les articles du produit sont recherchés .
<div>
<h3>Search Products</h3>
<form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
<input type="text" name="s" placeholder="Search Products"/>
<input type="hidden" name="post_type" value="products" /> <!-- // hidden 'products' value -->
<input type="submit" alt="Search" value="Search" />
</form>
</div>
pour plus, je voudrais vous lier ici
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/
get_query_var('post_type')
renvoyé un tableau (plutôt qu'une chaîne) afin qu'il ne puisse pas être comparé directement. Comme je ne cherche qu'un type de message à la fois, j'ai simplement changé mon$post_type
var en$post_type[0]
.http://localhost:3000/?s=cloud%27&post_type=product
http://localhost:3000/search/cloud/product
search_template
filtre semble être une alternative plus appropriée àtemplate_include
Voici ce qui fonctionne pour moi. Pas aussi propre mais je ne pouvais obtenir aucune de ces autres réponses au travail.
Formulaire de recherche pour le type de message personnalisé:
Dans functions.php:
Dans search.php:
Naturellement, dans les trois endroits, vous devrez remplacer "livre" par votre type de message personnalisé.
J'espère que cela aide quelqu'un!
la source
Un code court plus actualisé
la source
Je cherchais à utiliser deux formulaires différents pour mes recherches normales et mes recherches sur un type d'article personnalisé.
Mon type de message personnalisé utilise un en-tête différent de celui des pages normales. Sur ma page normale, l'appel de mon formulaire de recherche est le suivant:
Et l'appel à mon formulaire de recherche dans l'en-tête de type d'article personnalisé est le suivant:
Qui a un champ supplémentaire:
Dans le fichier de fonctions, j'ai le code suivant que vous avez fourni.
Qui détecte si le formulaire de recherche effectue une recherche dans des champs personnalisés, affichant ainsi la recherche dans un modèle personnalisé, sinon utilisez le modèle normal.
Edit: correction de l'appel de la fonction get_search_form () qui aurait retourné true quoi qu'il arrive.
la source
get_search_form('true')
devrait êtreget_search_form(true)
.get_search_form
cherche une entrée booléenne, donc soittrue
oufalse
. En le mettant entre guillemets, vous lui donnez une chaîne, pas un paramètre booléen. La façon dont la fonction est mise en place, à la fois'true'
et'false'
serait le même résultat, car ils sont à la fois des chaînes non vides ( ce qui provoque la fonction de retour vrai dans les deux cas).Pour résoudre le problème de recherche d'entrée vide, vous pouvez remplacer le code de fonction par ceci:
la source