You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');
    }
}

关键修复点说明

  1. 避免不必要的重写规则刷新:每次init刷新会拖慢网站,改为手动保存固定链接一次即可。
  2. WPML分类ID转换:用wpml_object_id过滤器将原始分类ID转为当前语言的对应ID,解决翻译后slug不匹配的问题。
  3. 严格的查询触发条件:只在目标页面的前台主查询中生效,不会干扰其他页面的查询逻辑。
  4. 合并查询参数:不直接覆盖tax_query或meta_query,而是合并原有参数,避免冲突。

额外注意事项

  • 确保WPML后台中所有产品分类都已完成对应语言的翻译。
  • 如果使用WooCommerce默认的「在售产品」逻辑,可以替换meta_query为:$query->set('meta_key', '_sale_price');,无需自定义onsale元字段。

内容的提问来源于stack exchange,提问作者ygnsl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:35:35