wake-up-neo.net

Einschließen von Kategorien in die Suchergebnisse

Ich versuche, Kategorien in die Suchergebnisse aufzunehmen. Ich habe jetzt stundenlang ohne Lösung gesucht.

Mit "Einschließen von Kategorien" meine ich nicht die Suche in einer bestimmten Kategorie, sondern sagen wir, ich habe einen Fahrradladen und viele Unternehmen auf der Website; Ein Benutzer suchte beispielsweise nach BMX mountain cross. Es wird zuerst die Kategorie BMX (wenn Sie auf klicken, werden Sie zur Kategorieseite weitergeleitet) und die Beiträge zum Suchbegriff zurückgegeben, wie es WordPress normalerweise tut.

Hat jemand irgendwelche Hinweise oder könnte er mich in die richtige Richtung weisen?

5
Yaniv Kossas

Ich benutze diesen Code in meiner search.php über der Hauptschleife:

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

Dieser Code führt eine zusätzliche DB-Abfrage durch, sucht jedoch nicht nur nach Kategorien, die zurückgegebenen Beiträgen zugeordnet sind, sondern sucht auch nach jedem Wort in einem Suchbegriff und bringt alle gefundenen Kategorien - auch wenn diese leer sind.

0
david.binda

Verwenden Sie get_terms(), dann müssen Sie keine benutzerdefinierte Abfrage für die Datenbank verwenden.

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

Basierend auf der Antwort von birgire auf eine ähnliche Frage: https://wordpress.stackexchange.com/a/239680/50432

3
Pim

Ich habe eine benutzerdefinierte Suchergebnisseite erstellt, die den Suchbegriffen mit Kategorien, Posts, Cpt's ... entspricht.

Hier ist der Code für die Kategorien (es zeigt auch ein Kategorie-ACF-Feld für Bilder:

<?php
    // post categories in results
    $terms = get_terms( 'post', array(
        'name__like' => $s,
        'hide_empty' => false // Optional 
    ) );
?>
<?php
// list post categories in results
if ( count($terms) > 0 ) {
    echo '<div class="sr-categories">';
    echo '<h3 class="search-title">Category results</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 or custom size)
            $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>'; // eof sr-events
} else {
    echo 'No Event categories found';
}
?>
1
Phil Owen

Basierend auf der Antwort von @PhilOwen fügte ich Folgendes oben auf der Seite search.php meines Themas hinzu:

// post categories in results
$terms = get_terms( 'taxonomy-goes-here', array(
  'name__like' => $s,
  'hide_empty' => false // Optional
) );

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

Ich denke, es ist oft sinnvoll, die Taxonomiebegriffsübereinstimmungen - sofern vorhanden - über den spezifischen Elementen anzuzeigen, da sie in der Datenhierarchie höher liegen würden.

0
MikeiLL

Natürlich ist es möglich, wenn es so funktioniert, ich benutze TwentyTwelve , du musst search.php editieren. Sie finden die Schleife dort:

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

Die Schleife übernimmt also die post_format(). Sie müssen also content.php bearbeiten. Hier finden Sie diese:

<?php if ( is_search() ) : // Only display Excerpts for Search ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->

Ändern Sie das einfach in:

<?php if ( is_search() ) : // Only display Excerpts for Search ?>
<div class="entry-summary">
<?php the_category(); ?><br/>
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->

Wenn alles richtig läuft, wird die dem Suchergebnis zugeordnete Kategorie wiedergegeben. Aber wenn alles gut geht, wie wir wollen. :)

0
Mayeenul Islam