Php 将父类别和子类别分组以进行发布和显示

Php 将父类别和子类别分组以进行发布和显示,php,wordpress,Php,Wordpress,我看到了一些关于如何显示父类别和子类别的问题,但似乎找不到解决方案 我正在使用默认的wordpress帖子和几个类别以及子类别作为示例 新闻 -旅行 -世界 -生意 文章 -一般的 案例研究 -托马斯·库克 -易喷 文章可以有任意数量的类别,但我想做的是将子项与其父项分组,以便在显示文章时,它可以以以下格式显示每个文章所使用的父项和子项类别(父项后面的冒号和子项后面的连字符,最后一个除外) 新闻:旅游世界 目前我正在使用以下代码 <?php $categories = get_the_c

我看到了一些关于如何显示父类别和子类别的问题,但似乎找不到解决方案

我正在使用默认的wordpress帖子和几个类别以及子类别作为示例

新闻 -旅行 -世界 -生意

文章 -一般的

案例研究 -托马斯·库克 -易喷

文章可以有任意数量的类别,但我想做的是将子项与其父项分组,以便在显示文章时,它可以以以下格式显示每个文章所使用的父项和子项类别(父项后面的冒号和子项后面的连字符,最后一个除外)

新闻:旅游世界

目前我正在使用以下代码

<?php 
$categories = get_the_category();
$separator = ' - ';
$output = '';
if ( ! empty( $categories ) ) {
    foreach( $categories as $category ) {
        $output .= '<a class="blog-panel-cat" href="' . esc_url( get_category_link( $category->term_id ) ) . '" alt="' . esc_attr( sprintf( __( 'View all posts in %s', 'textdomain' ), $category->name ) ) . '">' . esc_html( $category->name ) . '</a>' . $separator;
    }
    echo trim( $output );
}
?>

但是他只是一个接一个地输出一个类别,没有分组的方法,所以我可以在父级之后添加“:”,并用“-”分隔该父级的子级,在下一个父级之前还有一个双空格

谢谢你的帮助

谢谢


伊恩

几个月前我就处理过同样的案子,下面是我的解决方案

//first  part
$allcats = get_the_category();
$parent_id = $all_ids = array();

foreach ($allcats as $cats) {
    //get all category id first
    $all_ids[] = $cats->term_id;

    // get top parent category
    if ($cats->category_parent === 0 ) {
        $parent_id[] =  $cats->term_id;
    }
}

//second part
$separator = ' &raquo; ';
$term_ids = implode( ',' , $all_ids );

$post_categories  = '';
foreach ($parent_id as $parents) {
    $parent_name    = get_cat_name($parents);
    $parent_link    = get_category_link($parents);
    $parent_cat     = '<span class="parent"><a href="'.$parent_link.'">'.$parent_name.'</a></span>';

    //get all sub category with certain ids
    $child_cats = wp_list_categories(
        array(
        'child_of' =>  $parents, 
        'title_li' => '',
        'style'    => 'none',
        'echo'     => false,
        'taxonomy' => 'category',
        'include'  => $term_ids,

        )
    );
    $child_cats = rtrim( trim( str_replace( '<br />',  $separator, $child_cats ) ), $separator );
    $hcat .= '<b>'.$parent_cat.'</b> &raquo; '.$child_cats.'<br>';
}

echo $post_categories;
//第一部分
$allcats=获取_类别();
$parent_id=$all_id=array();
foreach($allcats作为$cats){
//首先获取所有类别id
$all_id[]=$cats->term_id;
//获取顶级父类别
如果($cats->category_parent==0){
$parent\u id[]=$cats->term\u id;
}
}
//第二部分
$separator='raquo;';
$term_id=内爆(',',$all_id);
$post_类别=“”;
foreach($parent\u id作为$parents){
$parent\u name=get\u cat\u name($parents);
$parent\u link=获取类别链接($parents);
$parent_cat='';
//获取具有特定ID的所有子类别
$child\u cats=wp\u列表\u类别(
排列(
“=>$父母的子女”,
“title_li'=>”,
“样式”=>“无”,
“echo”=>错误,
“分类法”=>“类别”,
'包括'=>$term\u id,
)
);
$child_cats=rtrim(修剪(str_replace('
',$separator,$child_cats)),$separator); $hcat.=''.$parent_cat.»;'.$child_cat.'
'; } echo$post_类别;

已测试,希望能有所帮助。

我在Rest Api中也做了类似的展示,所以这只是将所有类别排列成层次结构数组/对象。而且它只适用于一年级的孩子

$allcats = get_categories(); // get ALL categories 
// $allcats = get_the_category(); // get only categories assigned to post
$parents = $all_ids = array();

//  find parents
foreach ($allcats as $cats) {
    if ($cats->category_parent === 0 ) {
        $cats->children = array();
        $parents[] =  $cats;
    }
}

//  find childredn and assign it to corresponding parrent  
foreach ($allcats as $cats) {
    if ($cats->category_parent != 0) {
        foreach ($parents as $parent) {
            if ($cats->category_parent === $parent->term_id) {
                $parent->children[] = $cats;
            }
        }
    }
}
因此,结果将类似于:

[{
   term_id: 50,
   name: "Main Cat",
   slug: "main-cat",
   term_group: 0,
   term_taxonomy_id: 50,
   taxonomy: "category",
   description: "",
   parent: 0,
   count: 77,
   filter: "raw",
   term_order: "1",
   cat_ID: 50,
   category_count: 77,
   category_description: "",
   cat_name: "main cat",
   category_nicename: "main_cat",
   category_parent: 0,
   children: [
   {
      term_id: 49,
      name: "Sub Cat",
      slug: "sub-cat",
      term_group: 0,
      term_taxonomy_id: 49,
      taxonomy: "category",
      description: "",
      parent: 50,
      count: 43,
      filter: "raw",
      term_order: "1",
      cat_ID: 49,
      category_count: 43,
      category_description: "",
      cat_name: "sub_cat",
      category_nicename: "Sub Cat",
      category_parent: 50
    }, 
    {etc other children}
   ]
 }]
希望这对某人有帮助