0

There are multiple ways of showing a list of (custom) posts by taxonomy, but none appear to allow for pagination.

So, I can easily list all posts like:

Page 1

  • 1
  • 2
  • 3
  • 4
  • 5

Page 2

  • 6
  • 7
  • 8
  • 9
  • 10

With a little effort, I can list posts grouped by taxonomy

Page 1

  • A
    • 1
    • 2
  • B
    • 3
    • 4
    • 5
    • 6
  • C
    • 7
    • 8
  • D
    • 9
    • 10

But what I need help doing is mixing in pagination E.g.

Page 1

  • A
    • 1
    • 2
  • B
    • 3
    • 4
    • 5

Page 2

  • B
    • 6
  • C
    • 7
    • 8
  • D
    • 9
    • 10

Any ideas?

Example code below:

<?php // Get current Category $get_current_cat = get_term_by('name', single_cat_title('',false), 'category'); $current_cat = $get_current_cat->term_id; // List posts by the terms for a custom taxonomy of any post type $post_type = 'myposttype'; $tax = 'mytaxonomy'; $tax_terms = get_terms( $tax, 'orderby=name&order=ASC'); if ($tax_terms) { foreach ($tax_terms as $tax_term) { $args = array( 'post_type' => $post_type, "$tax" => $tax_term->slug, 'post_status' => 'publish', 'posts_per_page' => -1, 'category__in' => $current_cat // Only posts in current category (category.php) ); $my_query = null; $my_query = new WP_Query($args); if( $my_query->have_posts() ) : ?> <h2><?php echo $tax_term->name; // Group name (taxonomy) ?></h2> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?> <?php $term_list = wp_get_post_terms($post->ID, 'category', array("fields" => "ids")); // Get post categories IDs?> <?php if (in_array($current_cat, $term_list) ): // Display only posts that have current category ID ?> <h3><?php the_title(); ?></h3> <?php endif; // if in_array ?> <?php endwhile; // end of loop ?> <?php endif; // if have_posts() wp_reset_query(); } // end foreach #tax_terms } // end if tax_terms 

?>

2
  • 1
    What you are asking for is a little tricky but should be possible. Post your code please. Commented Mar 6, 2014 at 14:24
  • Updated with code Commented Mar 7, 2014 at 14:26

1 Answer 1

1

I figured it out!

First step, is to sort the posts by taxonomy (so that they're grouped together).

This will give a list of posts that can be paginated (just like a regular list).

The trick now, is to add a (taxonomy) heading above related posts.

So, for each pass of the loop Im looking at the taxonomy in which the post belongs. When this changes, I know that the "taxonomy group" has changed and therefore I need to show a heading.

E.g. Using my original example

  • 1 (Taxonomy A)
  • 2 (Taxonomy A)
  • 3 (Taxonomy B)
  • 4 (Taxonomy B)
  • 5 (Taxonomy B)
  • 6 (Taxonomy B)
  • 7 (Taxonomy C)
  • 8 (Taxonomy C)
  • 9 (Taxonomy D)
  • 10 (Taxonomy D)

For the first post, we don't have a current taxonomy, so display a header

  • A
    • 1 (Taxonomy A)
    • 2 (Taxonomy A)

As we move from posts 2 to 3, the current taxonomy changes, so let's display a header again

  • B
    • 3 (Taxonomy B)
    • 4 (Taxonomy B)
    • etc.

Here's the code Im using

<?php if ( $the_query->have_posts() ) : ?> <ol> <?php $current_taxonomy = ''; while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <?php $terms = get_the_terms( $post->ID, 'taxonomy_goes_here' ); if ( $terms && ! is_wp_error( $terms ) ) : $tax_terms = array(); foreach ( $terms as $term ) { $tax_terms[] = $term->name; } $current_tax_terms = join( ", ", $tax_terms ); ?> <?php endif; ?> <?php if($current_taxonomy != $current_tax_terms) { echo '<li><h2>'.$current_tax_terms.'</h2></li>'; $current_taxonomy = $current_tax_terms; } ?> <li><?php the_title();?></li> <?php endwhile; ?> </ol> <?php endif;?> 
1
  • Great work, there's one problem left for my part, but this code work as is ! All I need now, is to display the same post multiple time on different category ;) Commented Jun 30, 2014 at 18:51

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.