Woocommerce:在产品搜索查询中包括产品类别标题和描述

问题描述 投票:0回答:1

我正在尝试做什么

搜索产品时,搜索引擎仅查找产品信息(标题和描述)并显示它们。我正在寻找一种在查询中包含产品类别 (product_cat) 标题和描述的方法,以便我可以列出找到的类别中的所有产品。

我不想做什么

我不想显示类别,仅显示这些类别中的产品(如果在这些类别的标题或描述中找到这些术语)。

TL;博士

假设我有一个名为“宠物”的类别,其中包含名为猫、狗等的产品,但其标题或描述中没有“宠物”一词。我希望用户能够寻找宠物并在搜索结果中看到此“宠物”类别的所有产品。

到目前为止我尝试过这个

function SearchFilter($query) {
  if ($query->is_search && !is_admin()) {
    // Get the search query
    $search_query = $query->query_vars['s'];

    
    $query->set( 'tax_query', array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'name',
            'terms'    => $search_query,
            'operator' => 'LIKE'
        ),
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'description',
            'terms'    => $search_query,
            'operator' => 'LIKE'
        )
    ));

    $query->set('post_type', array('product'));
    $query->set( 'wc_query', 'product_query' );


    if (isset( $_GET['showall'] ) && $_GET['showall'] == 1 ) {
      $query->set( 'paged', 1 );
      $query->set( 'posts_per_page', - 1 );
    } else {
      $query->set( 'posts_per_page', 12 );
    }
  
  }
  return $query;
}
add_filter('pre_get_posts','SearchFilter');

但是好像没啥作用。根据我的发现,我的猜测是使用 posts_join、posts_where 和 post_district 过滤器首先在 Product_cat 中搜索,保存 ID,然后使用这些分类法查询产品(确保我们还显示标题中包含术语的产品/描述)。但我对此有点迷失。

php wordpress search woocommerce
1个回答
0
投票

通过过滤搜索查询找到了我的解决方案。希望有帮助:

function new_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {
        $join .= "
        INNER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id
        INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id
        INNER JOIN {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id";
    }

    return $join;
}
add_filter('posts_join', 'new_search_join' );


function new_search_where( $where ) {
    global $pagenow, $wpdb;

    if ( is_search()) {


        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "
              (".$wpdb->posts.".post_title LIKE $1)
              OR
              (".$wpdb->posts.".post_content LIKE $1)
              OR
              (".$wpdb->terms.".name LIKE $1)
              OR
              (".$wpdb->term_taxonomy.".description LIKE $1)
            ", $where );

    }

    return $where;
}
add_filter( 'posts_where', 'new_search_where' );

/**  Prevent duplicates  */
function new_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'new_search_distinct' );
© www.soinside.com 2019 - 2024. All rights reserved.