WordPress:按块分别获取父类别和子类别

WordPress: get parent and child categories separately by blocks

我需要将父类别和子类别分成不同的块。现在我有

<ul>
    <li class="cat-item">Parent_1
        <ul class="children">
            <li class="cat-item">Child_1_1</li>
            <li class="cat-item">Child_1_2</li>
        </ul>
    </li>
    <li class="cat-item">Parent_2
        <ul class="children">
            <li class="cat-item">Child_2_1</li>
            <li class="cat-item">Child_2_2</li>
        </ul>
    </li>
    <li class="cat-item">Parent_3
        <ul class="children">
            <li class="cat-item">Child_3_1</li>
            <li class="cat-item">Child_3_1</li>
        </ul>
    </li>
</ul>

我需要这样的东西

<div class="parent">
    <ul>
        <li class="cat-item">Parent_1</li>
        <li class="cat-item">Parent_2</li>
        <li class="cat-item">Parent_3</li>
    </ul>
</div>

<div class="children">
    <ul>
        <li class="cat-item">Child_1_1</li>
        <li class="cat-item">Child_1_2</li>
    </ul>
    <ul>
        <li class="cat-item">Child_2_1</li>
        <li class="cat-item">Child_2_2</li>
    </ul>
    <ul>
        <li class="cat-item">Child_3_1</li>
        <li class="cat-item">Child_3_1</li>
    </ul>
</div>

我可以单独获取父类别,一切都很好。我也可以获得所有的子类别,但问题是它们在父类别中没有分离。

<?php
$args = array(
    'taxonomy'     => 'courses',
    'hierarchical' => true,
    'hide_empty'   => false,
    'title_li'     => '',
    'parent' => 0 // with this argument, I get only the parent
);
?>
<div class="submenu">
    <ul>
        <?php wp_list_categories($args); ?>
    </ul>
</div>

试试下面的代码。您可以使用 get_terms() 函数来获取 courses 的所有项。然后你可以迭代循环并检查是父还是子。

$taxonomies = get_terms( array(
    'taxonomy' => 'courses',
    'hide_empty' => false
) );
 
if ( !empty($taxonomies) ) :
    $output = '<div class="parent"><ul>';
    foreach( $taxonomies as $category ) {
        if( $category->parent == 0 ) {
            $output .= '<li class="cat-item">'.$category->name.'</li>';
        }
    }
    $output.='</ul></div>';
    echo $output;
endif;

if ( !empty($taxonomies) ) :
    $output = '<div class="children">';
    foreach( $taxonomies as $category ) {
        if( $category->parent == 0 && get_term_children( $category->term_id, 'product_cat' ) ) {
            $output.= '<ul>';
            foreach( $taxonomies as $subcategory ) {
                if($subcategory->parent == $category->term_id ) {
                    $output .= '<li class="cat-item">'.$subcategory->name.'</li>';
                }
            }
            $output.='</ul>';
        }
    }
    $output.='</div>';
    echo $output;
endif;

已测试并有效。