ti-enxame.com

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

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

42
robert

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

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 Criar modelo de resultado da 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. Formulário de pesquisa de construção
    Neste Formulário de Pesquisa, o valor "produtos" está oculto e pesquisará somente 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>
    

para mais, eu gostaria de te ligar aqui
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/

58
Ronald

Aqui está o que funciona para mim. Não tão limpo, mas eu não consegui obter nenhuma dessas outras 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, em todos os três lugares, você precisará substituir "book" por seu tipo de postagem personalizado.

Espero que isso ajude alguém!

6
Shoelaced

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

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

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

Qual 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 de função get_search_form () que teria retornado true não importando o quê.

2
Fliberty

Para corrigir o problema de 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');
1
ciccioformaggio