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

?>

  • 1
    What you are asking for is a little tricky but should be possible. Post your code please. – s_ha_dum Mar 6 '14 at 14:24
  • Updated with code – Chris Mar 7 '14 at 14:26
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;?>
  • 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 ;) – Jonathan Lafleur Jun 30 '14 at 18:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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