phparrayswordpresstaxonomy

Get taxonomies in a category archive page


I'd like to show all the taxonomies related to the posts in a category page (archive).

I've the following code

<?php 
    $cat1 = $cat;
    $args = array( 'posts_per_page' => -1, 'category' => $cat1 );?>
    $myposts = get_posts( $args );
    foreach ( $myposts as $post ) {
        $product_terms = wp_get_object_terms($post->ID, 'Brands');
        echo '<ul>';
        foreach(array_unique($product_terms) as $term) {
            echo '<li><a href="'.get_term_link($term->slug, 'Brands').'">'.$term->name.'</a></li>'; 
        }
        echo '</ul>';
    }
?>

but it returns duplicates for taxonomies. I tried array_unique but it doesn't work. Could you please help. Thanks


Solution

  • Separate the loops, like this:

    <?php 
        $cat1 = $cat;
        $args = array( 'posts_per_page' => -1, 'category' => $cat1 );?>
        $myposts = get_posts( $args );
        $myterms = array();
        foreach ( $myposts as $mypost ) {
            foreach ( wp_get_object_terms($mypost->ID, 'Brands') as $term ) {
                $myterms[ $term->term_id ] = $term;
            }
        }
        echo '<ul>';
        foreach( $myterms as $term ) {
            echo '<li><a href="'.get_term_link($term->slug, 'Brands').'">'.$term->name.'</a></li>'; 
        }
        echo '</ul>';
    ?>
    

    If there are many terms, the approach above can result in PHP memory error. Here is another approach:

    <?php 
        $cat1 = $cat;
        $args = array( 'posts_per_page' => -1, 'category' => $cat1 );?>
        $myposts = get_posts( $args );
        $visited_term_ids = array();
        echo '<ul>';
        foreach ( $myposts as $mypost ) {
            foreach ( wp_get_object_terms($mypost->ID, 'Brands') as $term ) {
                if ( ! isset( $visited_term_ids[ $term->term_id ] ) ) {
                    echo '<li><a href="'.get_term_link($term->slug, 'Brands').'">'.$term->name.'</a></li>'; 
                    $visited_term_ids[ $term->term_id ] = TRUE;
                }
            }
        }
        echo '</ul>';
    ?>