web-dev-qa-db-ja.com

検索結果にカテゴリを含める

カテゴリを検索結果に含めようとしています。私は何時間も探していて解決策はありません。

「カテゴリを含める」とは、特定のカテゴリで検索することを意味するのではなく、自転車店があり、多くの企業がサイトに含まれているとします。たとえば、ユーザーがBMX mountain crossを検索したとします。それはカテゴリBMXを最初に返し(クリックすることでカテゴリページに送られます)、通常WordPressのような検索語に関連する投稿はします。

誰かが何か手がかりを持っていますか、または私を正しい方向に向けることができましたか?

5
Yaniv Kossas

私はメインループの上の私のsearch.phpでこのコードを使っています:

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

このコードは追加のDBクエリを実行しますが、返された投稿に関連するカテゴリを検索するだけでなく、検索語の各Wordに対して追加の検索を実行し、見つかったすべてのカテゴリを空にします。

0
david.binda

get_terms()を使用すれば、データベースへのカスタムクエリを使用する必要はありません。

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

birgire の同様の質問に対する回答に基づく: https://wordpress.stackexchange.com/a/239680/50432

3
Pim

カテゴリ、投稿、cptのキーワードと一致するカスタム検索結果ページを作成しました。

これがカテゴリのコードです(画像のカテゴリACFフィールドも表示されます)。

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

@PhilOwenの回答に基づいて、私は自分のテーマの search.php ページの先頭に以下を追加しました。

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

分類の用語の一致が存在する場合は、データの階層の上位にあるため、特定の項目の上に表示することが理にかなっていると思います。

0
MikeiLL

それがこのように機能するのであれば、明らかに可能ですが、私は TwentyTwelve を使っています、search.phpを編集する必要があります。そこにループがあります。

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

だから、ループはpost_format()を取っています。だからあなたはcontent.phpを編集しなければなりません。ここであなたはこれらを見つけるでしょう:

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

それを以下のように変更するだけです。

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

すべてうまくいけば、それは検索結果に関連するカテゴリを反映するでしょう。しかし、私たちが望むようにすべてがうまくいったら。 :)

0
Mayeenul Islam