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?
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.
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
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';
}
?>
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.
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. :)