Crear formulario de búsqueda por categoría de producto y palabras clave en WooCommerce
Quiero construir un formulario de búsqueda basado en categorías y palabras clave. Tengo el siguiente formulario:
<form role="search" method="get" id="searchform_special" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<div>
<label class="screen-reader-text" for="s"><?php _e( 'Buscar por:', 'woocommerce' ); ?></label>
<input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" placeholder="<?php _e( 'Buscar productos', 'woocommerce' ); ?>" />
<input type="submit" id="searchsubmit" value="<?php echo esc_attr__( 'Buscar' ); ?>" />
<input type="hidden" name="post_type" value="product" />
<input type="hidden" id="home_url" value="<?php echo esc_url( home_url( '/' ) ); ?>" />
<input type="hidden" id="categ_base_lang" value="<?php echo _x('product-category', 'slug', 'woocommerce') ?>" />
</div>
</form>
Solo funciona para palabras clave. Cuando lo actualizo para búsqueda por categoría no funciona. La captura de pantalla de mi página se muestra a continuación.
Quiero hacer este tipo de búsqueda en el encabezado. Por favor, ¿alguien puede ayudarme?

Acabo de implementarlo para un cliente, tendrás que hacerlo en la acción pre_get_posts
. Esto significa que agregarás parámetros a la consulta de WordPress antes de que devuelva las publicaciones.
Añade esto a functions.php:
// funcionalidad de búsqueda avanzada
function advanced_search_query($query) {
if($query->is_search()) {
// búsqueda por términos de categoría.
if (isset($_GET['category']) && !empty($_GET['category'])) {
$query->set('tax_query', array(array(
'taxonomy' => '***el_slug_de_taxonomía_de_tu_categoría***',
'field' => 'slug',
'terms' => array($_GET['category']) )
));
}
}
return $query;
}
add_action('pre_get_posts', 'advanced_search_query', 1000);
El código anterior funciona asumiendo que pasaste una variable category
. Puedes hacerlo creando una etiqueta select
con 'category' como nombre:
<select name="category">
<option value="***cat_slug***">Nombre de categoría</option>
<option value="***cat_slug***">Nombre de categoría</option>
<option value="***cat_slug***">Nombre de categoría</option>
</select>
El formulario completo:
<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<!-- Con este campo oculto puedes definir un tipo de publicación específico. -->
<input type="hidden" name="post_type" value="your_post_type" />
<input name="s" type="text" />
<select name="category">
<!-- Inserta aquí todas las etiquetas option que desees, con el slug de categoría como valor -->
</select>
<button type="submit">Enviar</button>
</form>
Una vez enviado, $_GET[] contendrá s
, post_type
y category
. s
y post_type
son usados por la búsqueda predeterminada de WP, y category
se usará en pre_get_posts()
para agregar parámetros a la consulta de WP.
Finalmente, la consulta de WP considerará:
- s : tus palabras clave.
- post_type : evita mezclar resultados si varios tipos de publicación tienen la misma taxonomía.
- category : la taxonomía en la que estás buscando.
Para WooCommerce
Reemplaza el atributo action
de tu etiqueta <form>
por:
<?php echo get_permalink( wc_get_page_id( 'shop' ) ); ?>
También puedes dejarlo vacío si estás seguro de que tu formulario solo está en la página de la tienda.
Establece el valor del campo oculto como product
, el slug del tipo de publicación personalizado para productos de WC.
