Includerea categoriilor în rezultatele căutării

5 feb. 2013, 07:55:14
Vizualizări: 25.5K
Voturi: 10

Încerc să includ categoriile în rezultatele căutării. Am căutat ore întregi fără să găsesc o soluție.

Când spun "includerea categoriilor" nu mă refer la căutarea într-o anumită categorie, ci de exemplu: am un magazin de biciclete cu mai multe branduri incluse pe site; un utilizator caută BMX mountain cross. Vreau ca rezultatele să afișeze mai întâi categoria BMX (prin click vei fi trimis la pagina categoriei) și apoi articolele legate de termenul căutat, așa cum face WordPress în mod normal.

Are cineva vreo sugestie sau mă poate îndruma în direcția corectă?

0
Toate răspunsurile la întrebare 8
0

Folosește get_terms(), astfel nu va fi necesar să utilizezi o interogare personalizată în baza de date.

$terms = get_terms( 'category', array(
    'name__like' => $s,
    'hide_empty' => true // Opțional 
) );
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>';
}

Bazat pe răspunsul lui birgire la o întrebare similară: https://wordpress.stackexchange.com/a/239680/50432

18 sept. 2016 20:35:28
1

Folosesc acest cod în search.php înainte de bucla 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>';
}

Acest cod face o interogare suplimentară în baza de date, dar caută categorii nu doar asociate postărilor returnate, ci face o căutare suplimentară pentru fiecare cuvânt din termenul de căutare și afișează toate categoriile găsite - chiar și cele goale.

5 feb. 2013 11:37:27
Comentarii

David mulțumesc. asta ar putea face ceea ce caut, dar am decis să folosesc get_term_by și să merg mai departe de acolo. voi accepta răspunsul tău

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

Am creat o pagină personalizată de rezultate căutare care potrivește cuvântul cheie (cuvintele cheie) cu categorii, articole, tipuri personalizate de postări (CPT)...

Iată codul pentru categorii (afișează și un câmp ACF pentru imagini ale categoriei):

<?php
    // categorii de postări în rezultate
    $terms = get_terms( 'post', array(
        'name__like' => $s,
        'hide_empty' => false // Opțional 
    ) );
?>
<?php
// listează categoriile de postări în rezultate
if ( count($terms) > 0 ) {
    echo '<div class="sr-categories">';
    echo '<h3 class="search-title">Rezultate categorii</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 sau dimensiune personalizată)
            $taximage = wp_get_attachment_image_src( $taximg_id, $taxsize );

            if($taximg_id) { ?>
                <img src="<?php echo $taximage[0]; ?>" alt="Imagine categorie <?php echo esc_attr( $term->name ); ?>" title="Imagine categorie <?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="Imagine implicită categorie" title="Imagine implicită categorie" />
            <?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>'; // sfârșit sr-events
} else {
    echo 'Nu s-au găsit categorii de evenimente';
}
?>
14 sept. 2018 16:59:34
1

Evident posibil, dacă funcționează așa, eu folosesc TwentyTwelve, trebuie să editați search.php. Acolo veți găsi loop-ul:

<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>

Deci, loop-ul preia post_format(). Așadar, trebuie să editați content.php. Aici veți găsi acestea:

<?php if ( is_search() ) : // Afișează doar rezumatul pentru căutare ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->

Doar schimbați asta cu:

<?php if ( is_search() ) : // Afișează doar rezumatul pentru căutare ?>
<div class="entry-summary">
<?php the_category(); ?><br/>
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->

Dacă totul merge bine, atunci va afișa categoria asociată rezultatului căutării. Dar dacă totul merge exact așa cum ne dorim. :)

5 feb. 2013 11:06:07
Comentarii

nu asta căutam deloc, dar mulțumesc. tu doar afișezi numele categoriei sau linkul pentru categorie, dacă îmi amintesc corect, nu încerc să fac asta.

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

Bazat pe răspunsul lui @PhilOwen, am adăugat următoarele la începutul paginii search.php din tema mea:

// categorii de postări în rezultate
$terms = get_terms( 'taxonomy-goes-here', array(
  'name__like' => $s,
  'hide_empty' => false // Opțional
) );

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>';
  }
}

Cred că are sens adesea să afișăm termenii de taxonomie care se potrivesc – dacă există – deasupra elementelor specifice, deoarece aceștia ar fi mai sus în ierarhia datelor.

11 apr. 2019 21:58:19
0

Am găsit o metodă mai bună și am vrut să o împărtășesc
nu este nevoie să folosim $wpdb
acest cod funcționează pentru mine:

$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;
}

acest cod caută în categoria de produse și nu este nevoie să fie exact același

29 dec. 2021 18:13:38
0

Am văzut câteva răspunsuri care folosesc get_terms(), ceea ce e bine, dar eu sunt un adept al abordării directe, așa că iată ce am creat folosind clasa WP_Term_Query din sursă @ 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'),
));

Apoi poți parcurge rezultatele:

<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

PROBLEM: Începând cu martie 2022, WordPress nu caută în categorii sau etichete.

SOLUȚIE/ALTERNATIVĂ: Folosește un plugin pentru a permite căutarea în categorii sau etichete. Am testat cu versiunea gratuită a plugin-ului Relevanssi. https://www.relevanssi.com/features/. Alte plugin-uri ar putea funcționa de asemenea.

DECONECTARE: Nu sunt asociat cu Relevanssi sau cu orice alt furnizor de plugin-uri de căutare pentru WordPress.

12 mar. 2022 21:13:57
Comentarii

WordPress nu a căutat niciodată în numele sau descrierile categoriilor, etichetelor (sau orice alt tip de taxonomie în general). Aceasta este chestiunea abordată în întrebare. "folosește un plugin" este un răspuns evident care nu aduce prea mult și nu este în spiritul răspunsurilor așteptate pe acest site.

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

Un plugin pentru ceva de genul acesta este într-adevăr exagerat. Ar trebui să folosești WP_Term_Query sau get_terms().

cfx cfx
20 feb. 2025 22:35:47