首页 > 解决方案 > 以默认语言获取产品类别的术语计数(使用 WPML)

问题描述

我使用 WPML 作为翻译插件和 Woocommerce。我的产品只有英文,其他语言没有翻译就回退到这些。但是,我面临产品类别计数的问题。如果网站语言是英语,例如在 Cat AI 中有 4 个产品。计数正确显示为 4。如果我切换到意大利语,则计数为 0。我已经与 WPML 支持进行了检查。他们建议我使用自定义代码。因此,我创建了一个简码来显示带有计数器的所有类别,就像 Woocmmerce [product_categories] 的官方简码一样。使用我自己的简码显示类别,但我仍然有同样的问题。这是我的代码。我有一个 if (ICL Language Code == '') 然后获取默认类别代码。我对此进行了测试,并获得了默认类别 ID。使用类别代码,我尝试获取术语计数。不过,似乎有些不对劲。即使 $default_lang_id 是英语的类别 ID,计数器也会退回到当前语言,例如意大利语。我是否需要直接从 terms_taxonomies -> count 通过 wp 查询来提供这个?

 function prod_categories() {
$get_featured_cats = array(
    'taxonomy'     => 'product_cat',
    'orderby'      => 'asc',
    'show_count'   => '1',
    'hide_empty'   => '0',
    'include'      => $cat_array
);

$all_categories = get_categories( $get_featured_cats );
$j = 1;
foreach ($all_categories as $cat) {
    $cat_id   = $cat->term_id;
    $cat_link = get_category_link( $cat_id );

    $thumbnail_id = get_woocommerce_term_meta( $cat->term_id, 'thumbnail_id', true ); // Get Category Thumbnail
    $image = wp_get_attachment_url( $thumbnail_id ); 
    if(ICL_LANGUAGE_CODE=='de' || ICL_LANGUAGE_CODE=='fr' || ICL_LANGUAGE_CODE=='it'){
    $default_lang_id = icl_object_id( $cat_id, 'product_cat', true, 'en' );
    $default_lang_count = get_term( $default_lang_id, 'product_cat' );

};
    if ( $image ) {
        echo '<div style="float:left;margin:10px;"><a href="' . $cat_link . '"><img src="' . $image . '" alt="" /><br><center>' . $cat->name . ' ('. $cat->count .')</center></a>'.$default_lang_id. ' ' .'('.$default_lang_count->count.')</div>';
    }
    $j++;
}
// Reset Post Data
wp_reset_query();

}
add_shortcode( 'prod_categories', 'prod_categories' );

请参阅此处的屏幕截图以更好地理解 在此处输入图像描述

标签: phpwordpress

解决方案


从 4.8 版本开始,WordPress 支持 get_terms 函数的“suppress_filter”参数。所以,我想错过的点是那个过滤器。此参数应强制函数忽略“WPML 存在因素”并按原样获取所有类别数据。

尝试添加并再次测试:

$get_featured_cats = array(
    'taxonomy'     => 'product_cat',
    'orderby'      => 'asc',
    'show_count'   => '1',
    'hide_empty'   => '0',
    'include'      => $cat_array,
    'suppress_filter'=>true
);

替代方式:(通过 SQL 查询)

    //$default_lang_id = icl_object_id( $cat_id, 'product_cat', true, 'en' );
    //$default_lang_count = get_term( $default_lang_id, 'product_cat' );
    global $wpdb;
    $default_lang_count=$wpdb->get_var("select count from 
    $wpdb->term_taxonomy 
    where term_id=".esc_sql($cat_id));

推荐阅读