Невозможно получить объект категории в некоторых шаблонах WooCommerce

Я использую get_category() чтобы получить объект категории по его идентификатору. Здесь category 39 является дочерью category 37 . Например,

 Courses (37) - Programming (39) 

Моя проблема в том, что если я использую get_category(37 or 39) в functions.php BOTH вернет null . Если я использую get_category(37 or 39) в single-product.php 37 (корневая категория), то возвращается null. Если я использую тот же самый вызов в add-to-cart/simple.php оба возвращают объект.

Сначала будут вызываться функции WooCommerce, а затем шаблоны single-product.php и add-to-cart/simple.php .

Что происходит?
Почему это работает в зависимости от файла?


@редактировать

 get_term( 37, 'category' ); 

похоже, тоже


@edit 13/7 – Правильное рабочее решение

Мне удалось решить эту проблему, прежде чем читать ответы:

 $category = get_term_by('id', $category_id, 'product_cat'); 

Рекомендации:

  • Функция get_term_by ()
  • Показать список категорий с заголовками
  • Как получить название категории из id продукта в woocommerce

Вы не можете использовать get_category() или get_term() напрямую с идентификатором везде. Вам нужно использовать больше аргументов, перечисленных здесь (см. Пример ниже) . На шаблонах я думаю, что это также зависит от отображаемых продуктов (если у них есть эта категория или подкатегория).

Чтобы получить желаемый объект категории, вам нужно будет сделать это по категории slug, и вместо этого вы будете использовать get_category_by_slug('the_slug') . Затем вы можете получить идентификатор с помощью:

 $idObj = get_category_by_slug('my_category_slug'); $id = $idObj->term_id; 

Другие полезные функции WordPress:
Чтобы получить название категории на основе идентификатора категории, вам нужно будет использовать get_the_category_by_ID() .
Вы также можете получить идентификатор по названию категории, и вы будете использовать get_cat_ID( 'cat_name' ) .


Список категорий продуктов и подкатегорий с помощью get_category() (пример) :

Здесь приведен пример функции, основанной на этом потоке , который будет перечислять все категории продуктов и подкатегории (везде) :

 function products_cats_subcats(){ $taxonomy = 'product_cat'; $orderby = 'name'; $show_count = 0; // 1 for yes, 0 for no $pad_counts = 0; // 1 for yes, 0 for no $hierarchical = 1; // 1 for yes, 0 for no $title = ''; $empty = 0; $args = array( 'taxonomy' => $taxonomy, 'orderby' => $orderby, 'show_count' => $show_count, 'pad_counts' => $pad_counts, 'hierarchical' => $hierarchical, 'title_li' => $title, 'hide_empty' => $empty ); $all_categories = get_categories( $args ); echo '<ul>'; foreach ($all_categories as $cat) { if($cat->category_parent == 0) { $category_id = $cat->term_id; echo '<li><a href="'. get_term_link($cat->slug, 'product_cat') .'">'. $cat->name .'</a></li>'; $args2 = array( 'taxonomy' => $taxonomy, 'child_of' => 0, 'parent' => $category_id, 'orderby' => $orderby, 'show_count' => $show_count, 'pad_counts' => $pad_counts, 'hierarchical' => $hierarchical, 'title_li' => $title, 'hide_empty' => $empty ); $sub_cats = get_categories( $args2 ); echo '<ol>'; if($sub_cats) { foreach($sub_cats as $sub_category) { echo '<li><a href="'. get_term_link($sub_category->slug, 'product_cat') .'">' . $sub_category->name .'</a></li>'; } } echo '</ol>'; } } echo '</ul>'; } 

Чтобы использовать его, просто поместите его туда, где хотите: <?php products_cats_subcats() ;?>

Это отобразит все ваши категории и подкатегории, иерархически упорядоченные по имени , с соответствующей ссылкой для каждой категории или подкатегории.


Затем вы можете также использовать get_term_by () для получения названия категории или пули:

 $term = get_term_by('id', $term_id, 'product_cat', 'ARRAY_A'); $term['name']; //get the WC category name $term['slug']; //get the WC category slug 

Теперь вы сможете создавать свои собственные функции, чтобы удовлетворить ваши потребности …


Справка:

  • Получить категории из WordPress Woocommerce
  • Ссылка на код> Функции> get_categories () *
  • Ссылка на код> Функции> get_terms () (и все необязательные аргументы) *
  • Ссылка на код> Функция get_term_by ()