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

38

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 créer ce formulaire de recherche personnalisé avec une mise en page différente ?

    
posée robert 07.03.2013 - 22:56
la source

5 réponses

55

Voici ce que j'ai essayé et obtenu une solution en 3 étapes. Supposons que votre type de message personnalisé soit " 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 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(); ?>
  1. Créer un formulaire de recherche
    Dans ce formulaire de recherche, la valeur "produits" est masquée et la recherche ne concerne que les produits .

     <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 d'informations, j'aimerais vous associer à ici. enlace

    
réponse donnée Ronald 08.03.2013 - 10:04
la source
6

Voici ce qui fonctionne pour moi. Pas aussi propre mais je n’ai pu obtenir aucune de ces autres réponses au travail.

Formulaire de recherche pour le type de publication personnalisée:

<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, aux trois endroits, vous devrez remplacer "livre" par votre type de message personnalisé.

J'espère que cela aide quelqu'un!

    
réponse donnée Shoelaced 12.01.2016 - 22:46
la source
3

Je cherchais à utiliser deux formulaires différents pour mes recherches normales et mes recherches sur un type d'article personnalisé.

Mon type d'article 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 de 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.

    
réponse donnée Fliberty 02.03.2017 - 08:20
la source
2

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'); 
    
réponse donnée Raylin Aquino Fernández 16.11.2015 - 05:18
la source
1

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');
    
réponse donnée ciccioformaggio 16.09.2014 - 12:33
la source

Lire d'autres questions sur les étiquettes