web-dev-qa-db-fra.com

Comment créer une recherche personnalisée pour un type de message personnalisé?

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 ?

42
robert

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(); ?>
  1. 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/

58
Ronald

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!

6
Shoelaced

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.

2
Fliberty

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');
1
ciccioformaggio