Incluyendo categorías en los resultados de búsqueda

5 feb 2013, 07:55:14
Vistas: 25.5K
Votos: 10

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?

0
Todas las respuestas a la pregunta 8
0

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

18 sept 2016 20:35:28
1

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.

5 feb 2013 11:37:27
Comentarios

David, gracias. Esto podría hacer lo que estoy buscando, pero he decidido usar get_term_by y continuar desde allí. Aceptaré tu respuesta

Yaniv Kossas Yaniv Kossas
5 feb 2013 19:17:56
0

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';
}
?>
14 sept 2018 16:59:34
1

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. :)

5 feb 2013 11:06:07
Comentarios

eso no es para nada lo que estaba buscando, pero gracias. Simplemente estás mostrando el nombre de la categoría o el enlace si es para la categoría, si recuerdo correctamente. No estoy intentando hacer eso.

Yaniv Kossas Yaniv Kossas
5 feb 2013 19:13:21
0

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.

11 abr 2019 21:58:19
0

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

29 dic 2021 18:13:38
0

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>
20 feb 2025 22:34:58
2
-1

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.

12 mar 2022 21:13:57
Comentarios

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.

Mark Kaplun Mark Kaplun
13 mar 2022 07:43:47

Un plugin para algo como esto realmente es excesivo. Deberías usar WP_Term_Query o get_terms().

cfx cfx
20 feb 2025 22:35:47