¿Cómo crear una búsqueda personalizada para el tipo de publicación personalizada?

38

Tengo un campo de búsqueda para las publicaciones del blog, pero necesito otro para un tipo de publicación personalizada. ¿Cómo puedo crear este formulario de búsqueda personalizado con un different diseño de resultados de búsqueda?

    
pregunta robert 07.03.2013 - 22:56

5 respuestas

55

Esto es lo que probé y obtuve una solución en 3 pasos. Digamos que su tipo de publicación personalizada es " productos "

1. Agregar código de función aquí puede especificar el 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. Cree plantilla de resultados de búsqueda para el tipo de publicación 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. Crear formulario de búsqueda
    En este formulario de búsqueda, el valor "productos" está oculto y buscará solo las publicaciones de producto .

     <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 obtener más información, me gustaría vincularlo aquí
enlace

    
respondido por el Ronald 08.03.2013 - 10:04
6

Esto es lo que funciona para mí. No tan limpio, pero no conseguí que ninguna de estas otras respuestas funcionara.

Formulario de búsqueda para tipo de publicación 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>

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

En 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, en los tres lugares necesitarás reemplazar "libro" con tu tipo de publicación personalizada.

Espero que esto ayude a alguien!

    
respondido por el Shoelaced 12.01.2016 - 22:46
3

Estaba buscando utilizar dos formularios diferentes para mis búsquedas normales y mis búsquedas en un tipo de publicación personalizada.

Mi tipo de publicación personalizada utiliza un encabezado diferente al de las páginas normales, en mi página normal, la llamada a mi formulario de búsqueda es:

<?php get_search_form(true); ?>

Y la llamada a mi formulario de búsqueda en el encabezado de tipo de publicación personalizada es:

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

Que tiene un campo adicional:

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

En el archivo de funciones, tengo el siguiente código que has proporcionado.

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

Detecta si el formulario de búsqueda está realizando una búsqueda dentro de campos personalizados, mostrando así la búsqueda en una plantilla personalizada, de lo contrario, utilice la plantilla normal.

Editar: arregló la llamada a la función get_search_form () que se hubiera vuelto verdadera sin importar qué.

    
respondido por el Fliberty 02.03.2017 - 08:20
2

Un código corto más actualizado

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

Para solucionar el problema de búsqueda de entrada vacía, puede sustituir el código de función con esto:

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

Lea otras preguntas en las etiquetas