为发布和显示分组父子类别

时间:2017-05-18 09:48:41

标签: php wordpress

我已经看到了一些关于如何显示父类别和子类别的问题,但似乎找不到我正在做的事情的解决方案。

我正在使用默认的wordpress帖子,其中有几个类别和子类别,例如我有

新闻 - 旅行 - 世界 - 业务

文章 - 一般

案例研究 -Thomas Cook - Easy Jet

帖子可以有任意数量的类别,但我要做的是将孩子与其父母分组,以便当我显示帖子时,例如,显示以下每个帖子使用的父母和子女类别format(除了最后一个孩子之后,在父和连字符之后的冒号)。

新闻:旅行 - 世界

目前我正在使用以下代码;

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

但是他只是输出一个类别而不能分组,所以我可以在父母之后添加':'并用' - '分隔父母的子项,并在下一个父母之前分隔一个双空格。

任何帮助表示赞赏

由于

伊恩

2 个答案:

答案 0 :(得分:0)

我几个月前就完全相同的情况工作了,这是我的解决方案

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

经过测试并希望得到这个帮助。

答案 1 :(得分:0)

我在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}
   ]
 }]

希望这有助于某人...