WPML多语言环境下自定义页面WooCommerce产品分类筛选失效
解决WPML下自定义页面WooCommerce产品分类筛选无结果问题
核心问题出在WPML对分类术语的语言映射处理上:第二语言下的分类slug是翻译后的,而你的自定义查询直接用slug匹配原始分类,且没有让WPML介入查询的语言过滤逻辑。以下是修正后的完整方案:
第一步:修正重写规则(避免性能损耗)
不要在init钩子中每次刷新重写规则,改为手动刷新固定链接。重写规则代码如下:
// 添加自定义重写规则和查询变量 add_action( 'init', 'add_custom_rewrite' ); function add_custom_rewrite() { $pages = [ [ 'page' => 'sooduspakkumised', 'slug' => 'kategooria', ], [ 'page' => 'special-offers', 'slug' => 'category' ] ]; // 注册自定义查询变量 add_rewrite_tag('%product_cats%', '([^&]+)'); foreach($pages as $page){ // 带分页的规则 add_rewrite_rule( '^'.$page['page'].'/'.$page['slug'].'/(.+?)/page/?([0-9]{1,})/?$', 'index.php?pagename='.$page['page'].'&product_cats=$matches[1]&paged=$matches[2]', 'top' ); // 基础规则 add_rewrite_rule( '^'.$page['page'].'/'.$page['slug'].'/(.+?)/?$', 'index.php?pagename='.$page['page'].'&product_cats=$matches[1]', 'top' ); } }
写完后,去后台「设置-固定链接」页面点击「保存更改」,让重写规则生效。
第二步:兼容WPML的查询逻辑替换
在pre_get_posts中,通过WPML的函数转换当前语言的分类ID,确保查询匹配对应语言的产品:
// 处理自定义页面的产品分类筛选,兼容WPML add_action('pre_get_posts', 'custom_sale_products_tax_query'); function custom_sale_products_tax_query($query){ // 仅在前台主查询、目标页面触发 if( !is_admin() && $query->is_main_query() && (is_page('sooduspakkumised') || is_page('special-offers')) ){ $product_cats_slug = get_query_var('product_cats'); if( !empty($product_cats_slug) ){ // 获取当前语言 $current_lang = apply_filters('wpml_current_language', NULL); // 通过slug获取原始分类对象 $cat_obj = get_term_by('slug', $product_cats_slug, 'product_cat'); if($cat_obj){ // 转换为当前语言的分类ID $translated_cat_id = apply_filters('wpml_object_id', $cat_obj->term_id, 'product_cat', true, $current_lang); if($translated_cat_id){ // 合并现有tax_query,避免覆盖 $tax_query = $query->get('tax_query', []); $tax_query[] = [ 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $translated_cat_id, 'operator' => 'IN' ]; $query->set('tax_query', $tax_query); } } } // 设置仅显示在售产品(根据你的元数据逻辑调整) $meta_query = $query->get('meta_query', []); $meta_query[] = [ 'key' => 'onsale', 'value' => '1', 'compare' => '=' ]; $query->set('meta_query', $meta_query); // 指定查询产品类型 $query->set('post_type', 'product'); } }
关键修复点说明
- 避免不必要的重写规则刷新:每次
init刷新会拖慢网站,改为手动保存固定链接一次即可。 - WPML分类ID转换:用
wpml_object_id过滤器将原始分类ID转为当前语言的对应ID,解决翻译后slug不匹配的问题。 - 严格的查询触发条件:只在目标页面的前台主查询中生效,不会干扰其他页面的查询逻辑。
- 合并查询参数:不直接覆盖
tax_query或meta_query,而是合并原有参数,避免冲突。
额外注意事项
- 确保WPML后台中所有产品分类都已完成对应语言的翻译。
- 如果使用WooCommerce默认的「在售产品」逻辑,可以替换meta_query为:
$query->set('meta_key', '_sale_price');,无需自定义onsale元字段。
内容的提问来源于stack exchange,提问作者ygnsl
相关产品推荐
相关产品推荐

