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

44

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

robert
fuente

Respuestas:

61

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

1) Agregar código de función aquí puede especificar el archivo-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 una 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 solo buscará publicaciones de productos .

     <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 más información, me gustaría vincularlo aquí
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/

Ronald
fuente
Consejo: al registrar el tipo de publicación, el argumento publicly_queryable debe establecerse en verdadero . De lo contrario, get_query_var ('post_type') nunca devolverá el valor post_type dado en el argumento url. codex.wordpress.org/Function_Reference/…
Gustavo
Otro consejo / edición sugerida: get_query_var('post_type')devolvió una matriz (en lugar de una cadena), por lo que no se pudo comparar directamente. Como solo estoy buscando un tipo de publicación a la vez, simplemente cambié mi $post_typevar a $post_type[0].
indextwo
¿hay alguna manera de reescribir la url de http://localhost:3000/?s=cloud%27&post_type=productahttp://localhost:3000/search/cloud/product
YarGnawh
@YarGnawh Perdón por la respuesta tardía, mira esto wordpress.stackexchange.com/questions/15418/… . Hay un complemento llamado rewrite también wordpress.org/plugins/rewrite
Ronald
el search_templatefiltro parece ser una alternativa más apropiada paratemplate_include
Alexey Kosov
6

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

Formulario de búsqueda para el 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 deberá reemplazar "libro" con su tipo de publicación personalizada.

¡Espero que esto ayude a alguien!

Cordones de los zapatos
fuente
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'); 
Raylin Aquino Fernández
fuente
2

Estaba buscando usar dos formas 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 ha 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');

Que detecta si el formulario de búsqueda está haciendo una búsqueda dentro de los campos personalizados, mostrando así la búsqueda en una plantilla personalizada, de lo contrario, use la plantilla normal.

Editar: se corrigió la llamada a la función get_search_form () que habría devuelto verdadero sin importar qué.

Fliberty
fuente
1
Vale la pena señalar, pero get_search_form('true')debería ser get_search_form(true). get_search_formestá buscando una entrada booleana, así que trueo false. Al envolverlo entre comillas, lo está alimentando con una cadena, no con un parámetro booleano. La forma en que se configura esa función, ambas 'true'y 'false'devolverían el mismo resultado, porque ambas son cadenas no vacías (lo que hace que la función devuelva verdadero en ambos casos).
Mike
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');
ciccioformaggio
fuente
3
Sería genial si explicas cómo funciona tu código, y revelas tu fuente del código
Pieter Goosen