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.
    – s_ha_dum
    Mar 6, 2014 at 14:24
  • Updated with code
    – Chris
    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 ;) Jun 30, 2014 at 18:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.