List all posts in custom post type by taxonomy

Is there a way I can list all posts in a specific custom post type and arrange them by the custom taxonomy term attached to them?

For example;

Read More

Taxonmy Term #1
Post Type
Post Type
Post Type

Taxonomy Term #2
Post Type
Post Type

Any help would be most appreciated.

Thanks.

Related posts

Leave a Reply

5 comments

  1. Try this

    $custom_terms = get_terms('custom_taxonomy');
    
    foreach($custom_terms as $custom_term) {
        wp_reset_query();
        $args = array('post_type' => 'custom_post_type',
            'tax_query' => array(
                array(
                    'taxonomy' => 'custom_taxonomy',
                    'field' => 'slug',
                    'terms' => $custom_term->slug,
                ),
            ),
         );
    
         $loop = new WP_Query($args);
         if($loop->have_posts()) {
            echo '<h2>'.$custom_term->name.'</h2>';
    
            while($loop->have_posts()) : $loop->the_post();
                echo '<a href="'.get_permalink().'">'.get_the_title().'</a><br>';
            endwhile;
         }
    }
    

    We get all the terms of a taxonomy, loop through them, and fire off a title link to each post that belongs to that term. If you need to reorder the taxonomy terms, you can do so with a plugin pretty easily. Reorder Taxonomy, I believe. But pay attention that this plugin adds(!) another column to your table on activation and does not remove it upon deactivation!

  2. Not a particularly elegant solution but you can create multiple queries each for the specific terms and then output them. Hopefully someone can come up with a nicer way of automatically pulling the terms to modify the output/sorting. But this would get you going.

    <?php
    
    //First Query for Posts matching term1
    $args = array(
        'tax_query' => array(
            array(
                'taxonomy' => 'taxonomy_1',
                'field' => 'slug',
                'terms' => array( 'term1' )
            ),
        ),
        'post_type' => 'my-post-type'
    );
    $query = new WP_Query( $args );
    
    if ( have_posts() ) {
    
        $term = $query->queried_object;
    
        echo 'All posts found in ' . $term->name;
    
        while ( have_posts() ) : the_post();
            //Output what you want
            the_title();
            the_content();
        endwhile;
    }
    
    //RESET YOUR QUERY VARS
    wp_reset_query();
    
    //Second Query for term2
    $args = array(
        'tax_query' => array(
            array(
                'taxonomy' => 'taxonomy_1',
                'field' => 'slug',
                'terms' => array( 'term2' )
            ),
        ),
        'post_type' => 'my-post-type'
    );
    $query = new WP_Query( $args );
    
    if ( have_posts() ) {
    
        $term = $query->queried_object;
    
        echo 'All posts found in ' . $term->name;
    
        while ( have_posts() ) : the_post();
            //Output what you want
            the_title();
            the_content();
        endwhile;
    }
    
  3. Nice one! GhostOne’s solution was what I had been looking for.
    In my situation the custom post type was ‘minining_accidents’ and custom taxonomies associated with this was ‘accident-types’ which had multiple terms under it. My idea was to create a custom widget to show list of posts under terms in this custom taxonomies. In my trial run it got what I wanted. Rest was spruce up. Here is my code:

    function fn_get_list_of_mining_accident_types()
    {
        $custom_taxonomy='accident-types';  
        $custom_terms = get_terms($custom_taxonomy);    
        $str_return='<ul>';
        foreach($custom_terms as $custom_term) 
        {
            wp_reset_query();
            $args = array(
                'post_type' => 'minining_accidents',
                'tax_query' => array(               
                    array(
                        'taxonomy' => $custom_taxonomy,
                        'field' => 'slug',
                        'terms' => $custom_term->slug,
                    ),
                ),
            );  
    
            $loop = new WP_Query($args);
    
            $term_name=$custom_term->name;
            $term_slug=$custom_term->slug;
            $term_link=get_term_link($term_slug, $custom_taxonomy);
    
            $str_return.='<li><a href="'.$term_link.'">'.$term_name.'</a>';
    
            if($loop->have_posts()) 
            {
                $str_return.='<ol>';
    
                while($loop->have_posts()) : $loop->the_post();
                    $str_return.='<li><a href="'.get_permalink().'">'.get_the_title().'</a></li> ';
                endwhile;
    
                $str_return.='</ol>';           
             }
             $str_return.='</li>';
        }
        $str_return.='</ul>';
        return $str_return;
    }
    

    Yes! There always is an option to further improve the code.

  4. This is long solution i tried before coming to this thread. Hope this may help someone to understand better.

            <?php
        // Get list of all taxonomy terms  -- In simple categories title
        $args = array(
                    'taxonomy' => 'project_category',
                    'orderby' => 'name',
                    'order'   => 'ASC'
                );
        $cats = get_categories($args);
    
        // For every Terms of custom taxonomy get their posts by term_id
        foreach($cats as $cat) {
            ?>
            <a href="<?php echo get_category_link( $cat->term_id ) ?>">
                <?php echo $cat->name; ?> <br>
                <?php // echo $cat->term_id; ?> <br>
            </a>
    
    
                <?php
                    // Query Arguments
                    $args = array(
                        'post_type' => 'portfolio', // the post type
                        'tax_query' => array(
                            array(
                                'taxonomy' => 'project_category', // the custom vocabulary
                                'field'    => 'term_id',          // term_id, slug or name  (Define by what you want to search the below term)    
                                'terms'    => $cat->term_id,      // provide the term slugs
                            ),
                        ),
                    );
    
                    // The query
                    $the_query = new WP_Query( $args );
    
                    // The Loop
                    if ( $the_query->have_posts() ) {
                        echo '<h2> List of posts tagged with this tag </h2>';
    
                        echo '<ul>';
                        $html_list_items = '';
                        while ( $the_query->have_posts() ) {
                            $the_query->the_post();
                            $html_list_items .= '<li>';
                            $html_list_items .= '<a href="' . get_permalink() . '">';
                            $html_list_items .= get_the_title();
                            $html_list_items .= '</a>';
                            $html_list_items .= '</li>';
                        }
                        echo $html_list_items;
                        echo '</ul>';
    
                    } else {
                        // no posts found
                    }
    
                    wp_reset_postdata(); // reset global $post;
    
                    ?>
    
        <?php } ?>
    
  5. To show a list of custom posts from a custom taxonomy

    $args = array(
        'tax_query' => array(
            array(
                'taxonomy' => 'your-custom-taxonomy',
                'field' => 'slug',
                'terms' => array( 'your-term' )
            ),
        ),
        'post_type' => 'your-post-type'
    );
    $loop = new WP_Query($args);
         if($loop->have_posts()) {
        $term = $wp_query->queried_object;
         while($loop->have_posts()) : $loop->the_post();
            //Output what you want      
       echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
          endwhile;
    }
    

    Title

    • List item
    • List item
    • List item