如何在WooCommerce搜索中处理带声调的希腊字符
WordPress WooCommerce 希腊语带声调字符搜索修复方案
核心思路
将用户输入的搜索关键词、数据库中的内容(商品标题/描述、分类/标签名称)统一转换为无声调希腊字符,实现带声调与无声调字符的双向匹配。
实现代码
将以下代码添加到主题的functions.php文件或自定义插件中:
1. 希腊字符规范化辅助函数
// 转换带声调希腊字符为无声调版本 function normalize_greek_chars($string) { $accented_chars = array('ά','έ','ή','ί','ό','ύ','ώ','Ά','Έ','Ή','Ί','Ό','Ύ','Ώ'); $plain_chars = array('α','ε','η','ι','ο','υ','ω','Α','Ε','Η','Ι','Ο','Υ','Ω'); return str_replace($accented_chars, $plain_chars, $string); }
2. 拦截并修改搜索查询
// 调整搜索查询,处理希腊字符声调 add_action('pre_get_posts', 'adjust_greek_search_query'); function adjust_greek_search_query($query) { // 仅处理前台主搜索请求 if (!is_admin() && $query->is_main_query() && $query->is_search()) { $search_term = $query->get('s'); if (!empty($search_term)) { $normalized_term = normalize_greek_chars($search_term); // 若关键词存在声调字符,替换为无声调版本并修改查询规则 if ($normalized_term !== $search_term) { $query->set('s', $normalized_term); add_filter('posts_search', 'modify_greek_search_sql', 10, 2); } } } } // 修改搜索SQL,让数据库字段也做字符规范化匹配 function modify_greek_search_sql($search, $query) { global $wpdb; if (!empty($search) && !is_admin()) { $search_term = $query->get('s'); $escaped_term = $wpdb->esc_like($search_term); // 处理文章标题的字符匹配 $search = str_replace( "{$wpdb->posts}.post_title LIKE '%{$escaped_term}%'", "REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE({$wpdb->posts}.post_title, 'ά','α'), 'έ','ε'), 'ή','η'), 'ί','ι'), 'ό','ο'), 'ύ','υ'), 'ώ','ω') LIKE '%{$escaped_term}%'", $search ); // 处理文章内容的字符匹配 $search = str_replace( "{$wpdb->posts}.post_content LIKE '%{$escaped_term}%'", "REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE({$wpdb->posts}.post_content, 'ά','α'), 'έ','ε'), 'ή','η'), 'ί','ι'), 'ό','ο'), 'ύ','υ'), 'ώ','ω') LIKE '%{$escaped_term}%'", $search ); // 处理WooCommerce商品分类与标签的字符匹配 if (class_exists('WooCommerce')) { $search .= " OR EXISTS ( SELECT 1 FROM {$wpdb->term_relationships} tr JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN {$wpdb->terms} t ON tt.term_id = t.term_id WHERE tr.object_id = {$wpdb->posts}.ID AND tt.taxonomy IN ('product_cat', 'product_tag') AND REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(t.name, 'ά','α'), 'έ','ε'), 'ή','η'), 'ί','ι'), 'ό','ο'), 'ύ','υ'), 'ώ','ω') LIKE '%{$escaped_term}%' )"; } } return $search; }
效果说明
- 用户输入带声调的希腊字符(如
άνθρωπος)或无声调字符(如ανθρωπος),均可匹配到对应的商品、分类和标签。 - 优先匹配完全一致的内容,同时支持声调转换后的模糊匹配。
内容的提问来源于stack exchange,提问作者Kyriakos13
相关产品推荐
相关产品推荐

