Réponses:
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é:
<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
<input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
<input type="hidden" name="post_type" value="book" />
</label>
<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>
Dans functions.php:
function searchfilter($query) {
if ($query->is_search && !is_admin() ) {
if(isset($_GET['post_type'])) {
$type = $_GET['post_type'];
if($type == 'book') {
$query->set('post_type',array('book'));
}
}
}
return $query;
}
add_filter('pre_get_posts','searchfilter');
Dans search.php:
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php if(isset($_GET['post_type'])) {
$type = $_GET['post_type'];
if($type == 'book') {?>
/* Format for "book" custom post type */
<?php } else { ?>
/* Format for custom post types that are not "book,"
or you can use elseif to specify a second post type the
same way as above. Copy the default format here if you
only have one custom post type. */
<?php } ?>
<?php } else { ?>
/* Format to display when the post_type parameter
is not set (i.e. default format) */
<?php } ?>
<?php endwhile; else: ?>
/* What to display if there are no results. */
<?php endif; ?>
Naturellement, dans les trois endroits, vous devrez remplacer "livre" par votre type de message personnalisé.
J'espère que cela aide quelqu'un!
Un code court plus actualisé
function template_chooser($template)
{
global $wp_query;
$post_type = $wp_query->query_vars["pagename"];
if( isset($_GET['s']) && $post_type == 'products' )
{
return locate_template('archive-search.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'template_chooser');
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:
<?php get_search_form(true); ?>
Et l'appel à mon formulaire de recherche dans l'en-tête de type d'article personnalisé est le suivant:
<?php get_template_part('search','library'); ?>
Qui a un champ supplémentaire:
<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.
Dans le fichier de fonctions, j'ai le code suivant que vous avez fourni.
/** Custom Search for Library */
function search_library($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( $wp_query->is_search && $post_type == 'library' )
{
return locate_template('search-library.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'search_library');
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.
get_search_form('true')
devrait être get_search_form(true)
. get_search_form
cherche une entrée booléenne, donc soit true
ou false
. 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:
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( isset($_GET['s']) && $post_type == 'products' )
{
return locate_template('archive-search.php'); // redirect to archive-search.php
}
return $template;
}
add_filter('template_include', 'template_chooser');