在搜索结果中包含类别

时间:2013-02-05 作者:Yaniv Kossas

我正在尝试在搜索结果中包含类别。我已经找了几个小时了,没有找到解决办法。

我所说的“包括类别”并不是指在某个类别中进行搜索,我的意思是说我有一家自行车店,网站中有许多公司;搜索的用户BMX mountain cross 例如它将首先返回类别BMX(通过单击您将被发送到类别页面)以及与搜索词相关的帖子,就像WordPress通常所做的那样。

有没有人有任何线索或能给我指出正确的方向?

6 个回复
最合适的回答,由SO网友:david.binda 整理而成

我正在搜索中使用此代码。主循环上方的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查询,但搜索的类别不仅与返回的帖子相关,而且还对搜索词中的每个单词执行额外的搜索,并将所有找到的类别(甚至为空)。

SO网友:Pim

使用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\'s对类似问题的回答:https://wordpress.stackexchange.com/a/239680/50432

SO网友:Phil Owen

我已经创建了一个自定义搜索结果页面,该页面将关键字与类别、帖子、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\';
}
?>

SO网友:Mayeenul Islam

显然有可能,如果它是这样工作的,我使用的是2122,你必须编辑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 -->
如果一切正常,它将回显与搜索结果关联的类别。但如果一切顺利,就像我们想要的那样。:)

SO网友:MikeiLL

根据@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>\';
  }
}
我认为,在特定项目上方显示分类术语匹配(如果存在)通常是有意义的,因为它们在数据层次结构中的位置更高。

SO网友:A Z

我找到了一个更好的方法,并想分享使用$wpdb的无需。这段代码适合我:

$val = get_search_query();
$categories = get_terms( [\'taxonomy\' => \'product_cat\'] );
    foreach($categories as $cat){
    if (stristr($cat->name , $val)){
        echo \'<tr><td><a href="\'.get_term_link( $cat ).\'" >\' .$cat->name.\'</a></td></tr>\';
        break;
}
此代码在产品类别中搜索,不需要完全相同

结束

相关推荐

Get_Query_var()在Pre_Get_Posts中不起作用

我正在使用pre_get_posts 钩子可以使用自定义元值对所有自定义帖子类型/分类页面上的主查询进行排序。作为逻辑的一部分,我试图通过使用get_query_var(\'taxonomy\'), 但是,无论我尝试什么,它都会不断返回一个空白字符串:function sort_query($query) ... if (is_tax()){ ... echo get_query_var(\'taxonomy\'); // E