2016-09-06 85 views
0

我正在开发使用Wordpress 4.6,WPML 3.5,WooCommerce Multilingual 3.8.6和WooCommerce 2.6.4版的WooCommerce多语言商店。WMPL以特定语言获得WooCommerce产品类别

该代码始终以主要语言返回类别,但从不返回指定语言的翻译。

下面是代码: -

private $lang; 

    function __construct($lang = "en") { 
     $this->lang = $lang; 
    } 

    private function getCategories() { 
     try { 
       $api = WC()->api->WC_API_Products; 
       $categories = $api->get_product_categories(); 

       $products_categories = $categories["product_categories"]; 

       foreach($products_categories as $category) { 
        $id = absint($category["id"]); 
        $category["name"] = $this->get_translated_term_name($id, "product_cat", $this->lang); 
       } 

       return $products_categories; 

      } catch (Exception $e) { 
       error_log("Caught $e"); 
      } 
    } 

    private function get_translated_term_name($term_id, $taxonomy, $language) { 

     $translated_term_id = icl_object_id($term_id, $taxonomy, true, $language); 

     $translated_term_object = get_term_by('id', $translated_term_id, $taxonomy); 

     return $translated_term_object->name; 
    } 

回答

0
<?php 
function wpa89819_wc_single_product(){ 

    $product_cats = wp_get_post_terms(get_the_ID(), 'product_cat'); 

    if ($product_cats && ! is_wp_error ($product_cats)){ 

     $single_cat = array_shift($product_cats); ?> 

     <h2 itemprop="name" class="product_category_title"><span><?php echo $single_cat->name; ?></span></h2> 

<?php } 
} 
add_action('woocommerce_single_product_summary', 'wpa89819_wc_single_product', 2); 
+0

谢谢你的答复,但我并不想用钩子和输出的类别为HTML,我想所有类别作为一个数组,因为它会发回的输入反应JSON来一个API请求。 – Waxren

0

我发现在这个环节的解决方案:

https://wpml.org/forums/topic/how-to-get-the-translated-taxonomy-object/

原来WPML自动调整分类的标识,以便消除调用get_term之前的过滤器解决了问题,这里是代码:

private function get_translated_term_name($term_id, $taxonomy, $language) { 

     global $sitepress; 
     remove_filter('get_term', array($sitepress,'get_term_adjust_id'), 1, 1); 

     $translated_term_id = icl_object_id($term_id, $taxonomy, true, $language); 

     $translated_term_object = get_term($translated_term_id, $taxonomy); 

     add_filter('get_term', array($sitepress,'get_term_adjust_id'), 1, 1); 

     return $translated_term_object->name; 
} 
0

此外,您可能会对get_term支持函数的行为感到惊讶。有时它不会返回与提供的term_id对应的项作为输入参数,而是返回缓存的结果!所以我重写了这种方式来绕过这一点。

private function getTerm($id) { 
    global $wpdb; 
    $id = absint($id); 
    if(!$id) { 
     return false; 
    } 
    $term = $wpdb->get_results("SELECT * FROM $wpdb->terms WHERE term_id=$id"); 
    return $term; 

}