wp_list_categories() - display first level categories and only current term's children in subcategory page

人盡茶涼 提交于 2021-02-08 03:58:13

问题


I'm using WordPress.

Have multiple categories with its subcategories. In general page, I'm displaying all first level categories. Here is my code:

$args = array(
   'type' => 'product-items',
   'child_of'  => 0,
   'parent'  => '',
   'order' => 'DESC',
   'hide_empty' => 0,
   'hierarchical' => 1,
   'exclude' => '',
   'include' => '',
   'number' => '',
   'taxonomy' => 'product-category',
   'pad_counts' => false,
   'depth' => 1,
   'title_li' => '' 
);
wp_list_categories($args);

Once you click and go inside a first level category, you need to see only its subcategories there. When I'm removing 'depth' => 1, option, all children appear under their parent category but for page speed/load, in sub page I need to show all first-level categories, but only current category's children.

For example, I have below 3 categories:

  • Category 1
  • Category 2
  • Category 3

Imagine I click on "Category 1". Now it is like this:

  • Category 1
    • 1st Sub Category of 1
    • 2nd Sub Category of 1
    • 3rd Sub Category of 1
  • Category 2
    • 1st Sub Category of 2
      • 1st sub of 2nd category sub
      • 2nd sub of 2nd category sub
      • 3rd sub of 2nd category sub
    • 2nd Sub Category of 2
    • 3rd Sub Category of 2
  • Category 3
    • 1st Sub Category of 3
    • 2nd Sub Category of 3
    • 3rd Sub Category of 3

But I need it to be like this in sub page:

  • Category 1
    • 1st Sub Category of 1
    • 2nd Sub Category of 1
    • 3rd Sub Category of 1
  • Category 2
  • Category 3

Not sure how to achieve this with wp_list_categories() function. Any ideas please?


回答1:


It would be better if you use 2 get_terms() instead of wp_list_categories. It would be faster and customizable. One for parent categories, another one for children of current category. Here is working example:

   function display_cats($cats,$current=0,$current_children=array()){
    $ret= '<ul>';
    foreach ($cats as $cs){
      $children=($current!=$cs->term_id)?'':display_cats($current_children);
      $ret.= '<li> <a href="'.get_term_link($cs->term_id).'"> '.$cs->name.'</a> '.$children.' </li>
      ';
    }
    $ret.= '</ul>';
    return $ret;
  }


  $current_cat=9;//for example
  $parents=get_terms('product_cat',array('taxonomy'=>'product_cat','echo'=>false,'depth'=>0));
  $current_children=get_terms('product_cat',array('taxonomy'=>'product_cat','child_of'=>  $current_cat ,'echo'=>false));
  echo display_cats($parents,$current_cat,$current_children);



回答2:


I'd take the get_terms() path. Something such as

$terms = get_terms($args);

foreach($terms as $term){
   // If $term is current term use get_terms() again to fetch its children
}

https://developer.wordpress.org/reference/functions/get_terms/




回答3:


For anyone who still needs help, here's how to do it.

$category = get_queried_object();
$category_id = $category->term_id;

From this we will get the current category id and we need to pass it to the array.

'child_of'  => $category_id,

This will get you all the subcategories of the current category.

Hope this is helpful.



来源:https://stackoverflow.com/questions/47097940/wp-list-categories-display-first-level-categories-and-only-current-terms-ch

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!