Includere le categorie nei risultati di ricerca
Sto cercando di includere le categorie nei risultati di ricerca. Ho cercato per ore senza trovare una soluzione.
Per "includere le categorie" non intendo cercare in una determinata categoria, ma per esempio, supponiamo di avere un negozio di biciclette con molte aziende incluse nel sito; se un utente cerca BMX mountain cross
, dovrebbe apparire prima la categoria BMX (cliccandoci si viene indirizzati alla pagina della categoria) e poi i post relativi al termine di ricerca come fa normalmente WordPress.
Qualcuno ha suggerimenti o può indirizzarmi nella giusta direzione?
Utilizza get_terms()
, così non avrai bisogno di usare una query personalizzata al database.
$terms = get_terms( 'category', array(
'name__like' => $s,
'hide_empty' => true // Opzionale
) );
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>';
}
Basato sulla risposta di birgire a una domanda simile: https://wordpress.stackexchange.com/a/239680/50432

Sto utilizzando questo codice nel mio search.php prima del loop principale:
$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>';
}
Questo codice esegue una query aggiuntiva al database, ma cerca le categorie non solo associate ai post restituiti, ma effettua una ricerca aggiuntiva per ogni parola del termine di ricerca e restituisce tutte le categorie trovate - anche quelle vuote.

Ho creato una pagina personalizzata per i risultati di ricerca che confronta le keyword con categorie, articoli, custom post type...
Ecco il codice per le categorie (mostra anche un campo ACF per le immagini delle categorie):
<?php
// categorie degli articoli nei risultati
$terms = get_terms( 'post', array(
'name__like' => $s,
'hide_empty' => false // Opzionale
) );
?>
<?php
// elenco categorie degli articoli nei risultati
if ( count($terms) > 0 ) {
echo '<div class="sr-categories">';
echo '<h3 class="search-title">Risultati per categorie</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 dimensioni personalizzate)
$taximage = wp_get_attachment_image_src( $taximg_id, $taxsize );
if($taximg_id) { ?>
<img src="<?php echo $taximage[0]; ?>" alt="Immagine della categoria <?php echo esc_attr( $term->name ); ?>" title="Immagine della categoria <?php echo esc_attr( $term->name ); ?>" class="img-responsive" />
<?php } else { ?>
<img src="<?php echo get_stylesheet_directory_uri(); ?>/assets/images/default-image-600x400.png" alt="Immagine predefinita" title="Immagine predefinita" />
<?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>'; // chiusura sr-events
} else {
echo 'Nessuna categoria di Eventi trovata';
}
?>

Ovviamente è possibile, se funziona così, sto usando TwentyTwelve, devi modificare search.php
. Lì troverai il loop:
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
Quindi, il loop sta prendendo il post_format()
. Perciò devi modificare content.php
. Qui troverai queste righe:
<?php if ( is_search() ) : // Mostra solo gli estratti per la Ricerca ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
Basta cambiarlo con:
<?php if ( is_search() ) : // Mostra solo gli estratti per la Ricerca ?>
<div class="entry-summary">
<?php the_category(); ?><br/>
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
Se tutto funziona correttamente, allora mostrerà la Categoria associata al risultato di ricerca. Ma solo se tutto va come speriamo. :)

Basato sulla risposta di @PhilOwen, ho aggiunto il seguente codice all'inizio della pagina search.php del mio tema:
// categorie dei post nei risultati
$terms = get_terms( 'taxonomy-goes-here', array(
'name__like' => $s,
'hide_empty' => false // Opzionale
) );
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>';
}
}
Penso che spesso abbia senso mostrare i termini della tassonomia che corrispondono alla ricerca - se esistono - sopra i singoli elementi, poiché sarebbero più in alto nella gerarchia dei dati.

Ho trovato un modo migliore e volevo condividerlo non c'è bisogno di usare $wpdb questo codice funziona per me:
$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;
}
questo codice cerca nelle categorie di prodotto e non ha bisogno che la corrispondenza sia esatta

Ho visto alcune risposte che utilizzano get_terms()
, il che va bene, ma sono un fan dell'andare alla fonte, quindi questo è ciò che ho creato utilizzando la classe WP_Term_Query
sorgente @ 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, // Numero massimo di termini da restituire
'orderby' => 'name', // Ordina per nome
'order' => 'ASC', // Ordine ascendente
'search' => $search_input_value, // Valore di ricerca
'taxonomy' => array('product_cat'), // Tassonomia delle categorie prodotto
));
Puoi poi ciclare attraverso i risultati:
<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>

PROBLEM: A partire da marzo 2022, WordPress non cerca per categoria o tag.
SOLUZIONE/ALTERNATIVA: Utilizzare un plugin per permettere la ricerca per categoria o tag. L'ho testato con la versione gratuita del plugin Relevanssi. https://www.relevanssi.com/features/. Anche altri plugin potrebbero funzionare.
DISCLAIMER: Non sono affiliato con Relevanssi o con qualsiasi altro fornitore di plugin di ricerca per WordPress.

WordPress non ha mai cercato nei nomi delle categorie, tag (o qualsiasi tipo di tassonomia in generale) o nelle descrizioni. Questo è il fulcro della domanda. "usa un plugin" è una risposta ovvia che non aggiunge molto e non è nello spirito delle risposte attese su questo sito.
