カテゴリを検索結果に含めようとしています。私は何時間も探していて解決策はありません。
「カテゴリを含める」とは、特定のカテゴリで検索することを意味するのではなく、自転車店があり、多くの企業がサイトに含まれているとします。たとえば、ユーザーがBMX mountain cross
を検索したとします。それはカテゴリBMXを最初に返し(クリックすることでカテゴリページに送られます)、通常WordPressのような検索語に関連する投稿はします。
誰かが何か手がかりを持っていますか、または私を正しい方向に向けることができましたか?
私はメインループの上の私の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に対して追加の検索を実行し、見つかったすべてのカテゴリを空にします。
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
カテゴリ、投稿、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';
}
?>
@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>';
}
}
分類の用語の一致が存在する場合は、データの階層の上位にあるため、特定の項目の上に表示することが理にかなっていると思います。
それがこのように機能するのであれば、明らかに可能ですが、私は 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 -->
すべてうまくいけば、それは検索結果に関連するカテゴリを反映するでしょう。しかし、私たちが望むようにすべてがうまくいったら。 :)