Como criar uma pesquisa personalizada para o tipo de postagem personalizada?

38

Eu tenho um campo de pesquisa para as postagens do blog, mas preciso de outro para um tipo de postagem personalizado. Como posso criar este formulário de pesquisa personalizado com um diferente layout de resultado de pesquisa?

    
por robert 07.03.2013 / 22:56
fonte

5 respostas

55

Aqui está o que eu tentei e consegui uma solução com 3 etapas. Digamos que seu tipo de postagem personalizado seja " produtos "

1. Adicionar Código de Função aqui você pode especificar o 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. Crie um modelo de resultado de pesquisa para um tipo de postagem personalizado (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. Criar formulário de pesquisa
    Neste Formulário de Pesquisa, o valor "produtos" está oculto e pesquisará somente as postagens do produto .

     <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>
    

para mais, eu gostaria de vinculá-lo aqui para enlace

    
por Ronald 08.03.2013 / 10:04
fonte
6

Aqui está o que funciona para mim. Não tão limpo, mas eu não consegui obter nenhuma dessas outras respostas para trabalhar.

Formulário de pesquisa para o tipo de postagem personalizada:

<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>

Em 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');

Em 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; ?>

Naturalmente, nos três lugares, você precisará substituir "reservar" por seu tipo de postagem personalizado.

Espero que isso ajude alguém!

    
por Shoelaced 12.01.2016 / 22:46
fonte
3

Eu estava procurando usar dois formulários diferentes para minhas pesquisas normais e minhas pesquisas em um tipo de postagem personalizado.

Meu tipo de postagem personalizada usa um cabeçalho diferente das páginas normais. Na minha página normal, a chamada para o meu formulário de pesquisa é:

<?php get_search_form(true); ?>

E a chamada para o meu formulário de pesquisa no cabeçalho do tipo de postagem personalizado é:

<?php get_template_part('search','library'); ?>

Que tem um campo adicional:

<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.

No arquivo de funções, tenho o seguinte código que você forneceu.

/** 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');

O que detecta se o formulário de pesquisa está fazendo uma pesquisa em campos personalizados, mostrando a pesquisa em um modelo personalizado, caso contrário, use o modelo normal.

Edit: consertou a chamada da função get_search_form () que teria retornado true não importando o que acontecesse.

    
por Fliberty 02.03.2017 / 08:20
fonte
2

Um código curto mais atualizado

 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'); 
    
por Raylin Aquino Fernández 16.11.2015 / 05:18
fonte
1

Para corrigir o problema da pesquisa de entrada vazia, você pode substituir o código de função por:

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');
    
por ciccioformaggio 16.09.2014 / 12:33
fonte