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

44

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 présentation de résultat de recherche différente ?

robert
la source

Réponses:

61

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

Ronald
la source
Astuce: lors de l' enregistrement du type poste, le publicly_queryable argument doit être réglé sur vrai . Sinon, get_query_var ('post_type') ne retournera jamais la valeur post_type donnée dans l'argument url. codex.wordpress.org/Function_Reference/…
Gustavo
Un autre conseil / suggestion de modification: 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_typevar en $post_type[0].
indextwo
y http://localhost:3000/?s=cloud%27&post_type=producthttp://localhost:3000/search/cloud/product
YarGnawh
@YarGnawh Désolé pour la réponse tardive, jetez un œil à cette wordpress.stackexchange.com/questions/15418/… . Il existe un plugin appelé rewrite too wordpress.org/plugins/rewrite
Ronald
le search_templatefiltre semble être une alternative plus appropriée àtemplate_include
Alexey Kosov
6

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!

Chaussé
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'); 
Raylin Aquino Fernández
la source
2

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.

Fliberty
la source
1
À noter, mais get_search_form('true')devrait être get_search_form(true). get_search_formcherche une entrée booléenne, donc soit trueou 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).
Mike
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');
ciccioformaggio
la source
3
Serait bien si vous expliquez comment votre code fonctionne, révélez votre source du code
Pieter Goosen