如何修改WordPress商品自动补全搜索,仅匹配标题与SKU?
实现WooCommerce商品标题+SKU的自动补全搜索
问题说明
现有WooCommerce商品自动补全搜索代码,默认会匹配商品描述,但无法搜索SKU。尝试分别添加标题搜索和SKU搜索的代码后,仅标题搜索生效,无法同时实现标题+SKU的搜索需求。
修改后的完整代码
替换原有相关代码为以下内容:
1. 核心搜索逻辑(替换原有两个单独的search函数)
function awp_search_title_and_sku( $search, $wp_query ) { global $wpdb; // 仅对自动补全查询生效,避免影响全局搜索 if ( ! isset( $wp_query->query_vars['awp_autocomplete'] ) || ! $wp_query->query_vars['awp_autocomplete'] ) { return $search; } if ( ! empty( $search ) && ! empty( $wp_query->query_vars['search_terms'] ) ) { $search_terms = $wp_query->query_vars['search_terms']; $n = ! empty( $wp_query->query_vars['exact'] ) ? '' : '%'; // 构建标题搜索条件 $title_conditions = []; foreach ( $search_terms as $term ) { $title_conditions[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $n . $wpdb->esc_like( $term ) . $n ); } $title_search = implode( ' AND ', $title_conditions ); // 构建SKU搜索条件 $sku_conditions = []; foreach ( $search_terms as $term ) { $sku_conditions[] = $wpdb->prepare( "$wpdb->postmeta.meta_value LIKE %s", $n . $wpdb->esc_like( $term ) . $n ); } $sku_search = implode( ' AND ', $sku_conditions ); // 合并标题和SKU的搜索条件 $combined_search = "($title_search) OR ($wpdb->postmeta.meta_key = '_sku' AND $sku_search)"; // 未登录用户过滤密码保护商品 if ( ! is_user_logged_in() ) { $combined_search .= " AND $wpdb->posts.post_password = ''"; } $search = ' AND (' . $combined_search . ')'; } return $search; } add_filter( 'posts_search', 'awp_search_title_and_sku', 10, 2 ); // 关联postmeta表用于SKU查询 function awp_join_postmeta_for_sku( $join, $wp_query ) { global $wpdb; if ( isset( $wp_query->query_vars['awp_autocomplete'] ) && $wp_query->query_vars['awp_autocomplete'] ) { $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id"; } return $join; } add_filter( 'posts_join', 'awp_join_postmeta_for_sku', 10, 2 ); // 避免重复搜索结果 function awp_distinct_results( $distinct, $wp_query ) { if ( isset( $wp_query->query_vars['awp_autocomplete'] ) && $wp_query->query_vars['awp_autocomplete'] ) { $distinct = 'DISTINCT'; } return $distinct; } add_filter( 'posts_distinct', 'awp_distinct_results', 10, 2 );
2. 修改自动补全AJAX查询函数
更新awp_autocomplete_search函数,添加自定义标识确保仅对该查询应用新搜索逻辑:
function awp_autocomplete_search() { check_ajax_referer('autocompleteSearchNonce', 'security'); $search_term = sanitize_text_field($_REQUEST['term']); if (empty($search_term)) { echo json_encode([]); wp_die(); } $suggestions = []; // 商品查询参数,添加自定义标识 $args = [ 'post_type' => 'product', 'posts_per_page' => 10, // 限制结果数量优化性能 's' => $search_term, 'awp_autocomplete' => true, // 触发自定义搜索逻辑的标识 'post_status' => 'publish', ]; $query = new WP_Query($args); if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); global $product; $product_id = $product->get_id(); $product_name = $product->get_name(); $product_image_url = get_the_post_thumbnail_url($product_id, 'thumbnail'); $suggestions[] = [ 'id' => $product_id, 'label' => $product_name, 'image' => $product_image_url, 'link' => get_permalink($product_id), ]; } wp_reset_postdata(); } echo json_encode($suggestions); wp_die(); }
3. 保留前端脚本与样式加载
原有wp_enqueue_scripts和woocommerce_js函数无需修改,直接保留即可。
关键修改说明
- 将标题、SKU搜索逻辑整合为一个函数,避免多个filter互相覆盖
- 通过自定义查询参数
awp_autocomplete,确保搜索逻辑仅作用于自动补全查询,不影响全局搜索 - 手动关联
postmeta表实现SKU查询,并添加DISTINCT避免重复结果 - 限制查询结果数量,提升搜索响应速度
内容的提问来源于stack exchange,提问作者brc
相关产品推荐
相关产品推荐

