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

44

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

Robert
fonte

Respostas:

61

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

1 Adicione o código da 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 o tipo de postagem personalizada (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á apenas postagens de produtos .

     <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 obter mais informações, eu gostaria de vincular você aqui
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/

Ronald
fonte
Dica: ao registrar o tipo de postagem, o argumento publicly_queryable deve ser definido como true . Caso contrário, o get_query_var ('post_type') nunca retornará o valor post_type fornecido no argumento url. codex.wordpress.org/Function_Reference/…
Gustavo
Outra dica / edição sugerida: get_query_var('post_type')retornou uma matriz (em vez de uma string) para que não pudesse ser comparada diretamente. Como só estou pesquisando um tipo de postagem de cada vez, simplesmente mudei meu $post_typevar para $post_type[0].
indextwo
há uma maneira de reescrever o url a partir http://localhost:3000/?s=cloud%27&post_type=productdehttp://localhost:3000/search/cloud/product
YarGnawh
@YarGnawh Desculpe pela resposta tardia, verifique isto wordpress.stackexchange.com/questions/15418/… . Existe um plugin chamado reescrita também wordpress.org/plugins/rewrite
Ronald
o search_templatefiltro parece ser uma alternativa mais adequada paratemplate_include
Alexey Kosov
6

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

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 "livro" pelo seu tipo de postagem personalizado.

Espero que isso ajude alguém!

Cadarço
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'); 
Raylin Aquino Fernández
fonte
2

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 personalizado 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 personalizada é:

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

Que possui 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');

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

Edit: corrigida a chamada de função get_search_form () que retornaria true, não importa o quê.

Fliberty
fonte
1
Vale a pena notar, mas get_search_form('true')deveria ser get_search_form(true). get_search_formestá procurando uma entrada booleana, então trueou false. Ao colocá-lo entre aspas, você está alimentando uma string, não um parâmetro booleano. A maneira como essa função é configurada, ambas 'true'e 'false'retornaria o mesmo resultado, porque ambas são seqüências de caracteres não vazias (o que faz com que a função retorne verdadeira nos dois casos).
22418 Mike
1

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

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
fonte
3
Seria ótimo se você explicar como seu código funciona, uma revelar sua fonte do código
Pieter Goosen