Change Posts per page count

In the wordpress settings => Reading => Blog pages show at most [input field] posts

I have it set to 3 posts at the moment.

Read More

On my index, date archives, tag archives, category archives, search results, etc… All pages that use the loop and paging, it shows 3 posts per page now.

My goal is to be able to have different number of results for different pages. ON my index maybe have 3 posts but on search results or archives, show a different number of results per page.

Any ideas how to do this?

Related posts

Leave a Reply

3 comments

  1. This will do it: (add to your theme’s functions.php)

    add_action( 'pre_get_posts',  'set_posts_per_page'  );
    function set_posts_per_page( $query ) {
    
      global $wp_the_query;
    
      if ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_search() ) ) {
        $query->set( 'posts_per_page', 3 );
      }
      elseif ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_archive() ) ) {
        $query->set( 'posts_per_page', 5 );
      }
      // Etc..
    
      return $query;
    }
    
  2. Improving on the answer above: hook pre_get_posts is fetched by reference, thus it does not require a global call or a returncall.

    add_action( 'pre_get_posts',  'set_posts_per_page'  );
    function set_posts_per_page( $query ) {
    
      if ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_search() ) ) {
        $query->set( 'posts_per_page', 3 );
      }
      elseif ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_archive() ) ) {
        $query->set( 'posts_per_page', 5 );
      }
      // Etc..
    
    }
    
  3. Using $GLOBALS[‘wp_query’] or just $wp_query

    add_action( 'pre_get_posts',  'set_posts_per_page'  );
    function set_posts_per_page( $query ) {
    
      if ( ( ! is_admin() ) && ( $query === $GLOBALS['wp_query'] ) && ( $query->is_search() ) ) {
        $query->set( 'posts_per_page', 3 );
      }
      elseif ( ( ! is_admin() ) && ( $query === $GLOBALS['wp_the_query'] ) && ( $query->is_archive() ) ) {
        $query->set( 'posts_per_page', 5 );
      }
    
      return $query;
    }