J'ai un champ de recherche pour les articles du blog, mais j'en ai besoin d'un autre pour un type d'article personnalisé. Comment puis-je créer ce formulaire de recherche personnalisé avec un différent présentation du résultat de la recherche ?
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 vous pouvez spécifier ici le 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 modèle de résultat de recherche pour le 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 la recherche ne concerne que product posts.
<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/
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.
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');