Incluyendo categorías en los resultados de búsqueda
Estoy tratando de incluir categorías en los resultados de búsqueda. He estado buscando durante horas sin encontrar una solución.
Por "incluir categorías" no me refiero a buscar en una categoría específica, sino que, por ejemplo, si tengo una tienda de bicicletas con varias marcas incluidas en el sitio; cuando un usuario busca BMX mountain cross
, primero aparecería la categoría BMX (al hacer clic te llevará a la página de la categoría) y luego los posts relacionados con el término de búsqueda como WordPress lo hace normalmente.
¿Alguien tiene alguna pista o podría indicarme la dirección correcta?

Utiliza get_terms()
, así no necesitarás realizar una consulta personalizada a la base de datos.
$terms = get_terms( 'category', array(
'name__like' => $s,
'hide_empty' => true // Opcional
) );
if ( count($terms) > 0 ){
echo '<ul>';
foreach ( $terms as $term ) {
echo '<li><a href="' . esc_url( get_term_link( $term ) ) . '" title="' . esc_attr( $term->name ) . '">' . esc_html( $term->name ) . '</a></li>';
}
echo '</ul>';
}
Basado en la respuesta de birgire a una pregunta similar: https://wordpress.stackexchange.com/a/239680/50432

Estoy usando este código en mi search.php antes del bucle principal:
$search_term = explode( ' ', get_search_query( false ) );
global $wpdb;
$select = "
SELECT DISTINCT t.*, tt.*
FROM wp_terms AS t
INNER JOIN wp_term_taxonomy AS tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy IN ('category')";
$first = true;
foreach ( $search_term as $s ){
if ( $first ){
$select .= " AND (t.name LIKE '%s')";
$string_replace[] = '%'.$wpdb->esc_like( $s ).'%';
$first = false;
}else{
$select .= " OR (t.name LIKE '%s')";
$string_replace[] = '%'. $wpdb->esc_like( $s ).'%';
}
}
$select .= " ORDER BY t.name ASC";
$terms = $wpdb->get_results( $wpdb->prepare( $select, $string_replace ) );
if ( count($terms) > 0 ){
echo '<ul>';
foreach ( $terms as $term ) {
echo '<li><a href="'.esc_url( get_term_link( $term ) ).'" title="'.esc_attr( $term->name ).'">' . esc_html( $term->name ) . '</a></li>';
}
echo '</ul>';
}
Este código realiza una consulta adicional a la base de datos, pero busca categorías no solo asociadas a las publicaciones devueltas, sino que hace una búsqueda adicional por cada palabra en el término de búsqueda y trae todas las categorías encontradas, incluso las vacías.

He creado una página personalizada de resultados de búsqueda que coincide con la(s) palabra(s) clave con categorías, publicaciones, CPT's...
Aquí está el código para las categorías (también muestra un campo ACF de categoría para imágenes:
<?php
// categorías de posts en resultados
$terms = get_terms( 'post', array(
'name__like' => $s,
'hide_empty' => false // Opcional
) );
?>
<?php
// listar categorías de posts en resultados
if ( count($terms) > 0 ) {
echo '<div class="sr-categories">';
echo '<h3 class="search-title">Resultados de categorías</h3>';
?>
<div class="posts-wrap posts-layout-default row">
<?php
foreach ( $terms as $term ) { ?>
<?php
echo '<article class="sub-cat-row col-md-4 col-sm-6 col-xs-6 col-xxs-12">';
echo '<a href="' . esc_url( get_term_link( $term ) ) . '" title="' . esc_attr( $term->name ) . '">';
$taximg_id = get_field('image', $term);
$taxsize = "grid-image"; // (thumbnail, medium, large, full o tamaño personalizado)
$taximage = wp_get_attachment_image_src( $taximg_id, $taxsize );
if($taximg_id) { ?>
<img src="<?php echo $taximage[0]; ?>" alt="" class="img-responsive" />
<?php } else { ?>
<img src="<?php echo get_stylesheet_directory_uri(); ?>/assets/images/default-image-600x400.png" alt="" title="" />
<?php }
echo '<div class="sc-title text-center">' . esc_html( $term->name ) . '</div></a>';
echo '</article>';
//get_template_part('template-parts/loop/content','listevents');
wp_reset_postdata();
}
?>
</div>
<?php echo '</div>'; // fin de sr-events
} else {
echo 'No se encontraron categorías de Eventos';
}
?>

Obviamente es posible, si funciona así. Estoy usando TwentyTwelve, tienes que editar el archivo search.php
. Allí encontrarás el loop:
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
El loop está tomando el post_format()
. Así que debes editar content.php
. Allí encontrarás esto:
<?php if ( is_search() ) : // Solo mostrar extractos en búsquedas ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
Solo cámbialo por:
<?php if ( is_search() ) : // Solo mostrar extractos en búsquedas ?>
<div class="entry-summary">
<?php the_category(); ?><br/>
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
Si todo va bien, mostrará la categoría asociada al resultado de búsqueda. Pero si todo sale como queremos. :)

Basándome en la respuesta de @PhilOwen, agregué lo siguiente al principio de la página search.php de mi tema:
// categorías de posts en los resultados
$terms = get_terms( 'taxonomy-goes-here', array(
'name__like' => $s,
'hide_empty' => false // Opcional
) );
if ( count($terms) > 0 ) {
foreach ( $terms as $term ) {
echo '<h2><a href="' . esc_url( get_term_link( $term ) ) . '" title="' . esc_attr( $term->name ) . '">';
echo esc_html( $term->name );
echo '</a></h2>';
}
}
Creo que a menudo tendrá sentido mostrar las coincidencias de términos de taxonomía (si existen) por encima de los elementos específicos, ya que estarían más arriba en la jerarquía de datos.

Encontré una mejor forma y quería compartirla no es necesario usar $wpdb este código funciona para mí:
$val = get_search_query();
$categories = get_terms( ['taxonomy' => 'product_cat'] );
foreach($categories as $cat){
if (stristr($cat->name , $val)){
echo '<tr><td><a href="'.get_term_link( $cat ).'" >' .$cat->name.'</a></td></tr>';
break;
}
este código busca en las categorías de producto y no necesita coincidir exactamente

He visto algunas respuestas que usan get_terms()
, lo cual está bien, pero soy fanático de ir directo a la fuente, así que esto es lo que se me ocurrió usando la clase WP_Term_Query
de la fuente @ https://github.com/WordPress/wordpress-develop/blob/6.7/src/wp-includes/class-wp-term-query.php#L96:
$product_category_query = new WP_Term_Query(array(
'number' => 10,
'orderby' => 'name',
'order' => 'ASC',
'search' => $search_input_value,
'taxonomy' => array('product_cat'),
));
Luego puedes iterar a través de los resultados:
<ul>
<?php foreach($product_category_query->terms as $term) : ?>
<li><a href="<?php echo get_term_link($term); ?>"><?php echo $term->name; ?></a></li>
<?php endforeach; ?>
</ul>

PROBLEMA: A partir de marzo de 2022, WordPress no busca por categoría o etiqueta.
SOLUCIÓN/ALTERNATIVA: Usar un plugin para permitir la búsqueda por categoría o etiqueta. Lo he probado con la versión gratuita del Plugin Relevanssi. https://www.relevanssi.com/features/. Otros plugins también pueden funcionar.
DESCARGO DE RESPONSABILIDAD: No estoy afiliado con Relevanssi ni con ningún otro proveedor de plugins de búsqueda para WordPress.

WordPress nunca ha buscado en los nombres o descripciones de categorías, etiquetas (o cualquier tipo de taxonomía en general). Esto es de lo que trata la pregunta. "Usar un plugin" es una respuesta obvia que realmente no aporta mucho y no está en el espíritu de las respuestas esperadas en este sitio.
