WMPL получить категорию продукта WooCommerce на определенном языке

Я разрабатываю многоязычный магазин WooCommerce с использованием Wordpress 4.6, WPML 3.5, WooCommerce Multilingual 3.8.6 и WooCommerce версии 2.6.4.

Код всегда возвращает категории на основном языке, но никогда не возвращает перевод для указанного языка.

Вот код: -

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

person Waxren    schedule 06.09.2016    source источник


Ответы (3)


Я нашел решение по этой ссылке:

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;
}
person Waxren    schedule 08.09.2016

Также вас может удивить поведение функции поддержки 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;

}

person user2702885    schedule 17.09.2016

person    schedule
comment
Спасибо за ответ, но я не хочу использовать хуки и выводить категорию в html, я хочу, чтобы все категории были в виде массива, потому что они будут отправлены обратно как json-ответ на запрос API. - person Waxren; 08.09.2016