web-dev-qa-db-fra.com

Inclusion de catégories dans les résultats de recherche

J'essaie d'inclure des catégories dans les résultats de recherche. Je cherche depuis des heures sans solution.

Par "y compris les catégories", je ne veux pas dire rechercher dans une certaine catégorie, je veux dire, disons que j'ai un magasin de vélos et que de nombreuses entreprises sont incluses dans le site; un utilisateur a recherché BMX mountain cross par exemple. Il retournera d'abord la catégorie BMX (en cliquant sur vous serez envoyé à la page de catégorie) et les posts liés au terme de recherche comme WordPress le font normalement.

Est-ce que quelqu'un a des indices ou pourrait me diriger dans la bonne direction?

5
Yaniv Kossas

J'utilise ce code dans mon search.php au-dessus de la boucle 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>';
}

Ce code effectue une requête supplémentaire dans la base de données, mais recherche les catégories non seulement associées aux publications renvoyées, mais effectue une recherche supplémentaire pour chaque mot dans un terme de recherche et apporte toutes les catégories trouvées, même les vides.

0
david.binda

Utilisez get_terms(), vous n'avez donc pas besoin d'utiliser une requête personnalisée pour la base de données.

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

Basé sur la réponse de birgire à une question similaire: https://wordpress.stackexchange.com/a/239680/50432

3
Pim

J'ai créé une page de résultats de recherche personnalisée qui associe le (s) mot (s) clé (s) à une catégorie, une publication, un cpt ...

Voici le code pour les catégories (il montre également un champ de catégorie ACF pour les images:

<?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

Sur la base de la réponse de @PhilOwen, j'ai ajouté ce qui suit en haut de la page search.php de mon thème:

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

Je pense qu'il sera souvent logique d'afficher les correspondances de termes de taxonomie - si elles existent - au-dessus des éléments spécifiques, car ils seraient plus haut dans la hiérarchie des données.

0
MikeiLL

Évidemment possible, si cela fonctionne comme ça, j'utilise TwentyTwelve , vous devez éditer search.php. Vous trouverez la boucle ici:

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

Donc, la boucle prend la post_format(). Donc, vous devez éditer content.php. Ici vous trouverez ceux-ci:

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

Il suffit de changer cela pour:

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

Si tout se passe bien, la catégorie associée au résultat de la recherche sera répercutée. Mais si tout se passe comme on veut. :)

0
Mayeenul Islam