search ]

Change number of posts displayed on a CPT archive pages

In order to change the number of posts displayed on archive pages of a specific custom content type, you can use the pre_get_posts action, which you might already be familiar with.

By default, the number of posts displayed is determined by the settings in the WordPress admin dashboard under Settings > Reading under the option “Blog pages show at most”. However, you might want a different number of posts to be displayed on standard posts compared to custom content type posts that you’ve created yourself or through a plugin.

The pre_get_posts action acts as a filter for the main query running on the page. If you want to modify the number of results in this query, it’s better and more efficient to use pre_get_posts rather than creating a new query using WP_Query. Here’s the code you can use to achieve this:

// Display all posts on XXXXXX Archive Page
function sv_cpt_page( $query ) {
    if ( !is_admin() && $query->is_main_query() && is_post_type_archive( 'XXXXXXX' ) ) {
        $query->set( 'posts_per_page', '-1' );
add_action( 'pre_get_posts', 'sv_cpt_page' ); 

Please note that you should replace XXXXXX with the name of the Custom Post Type you’ve defined.

In this case, all posts on the archive page of the XXXXXX content type will be displayed, as we’ve set posts_per_page to -1. You can change this to any number you prefer.
Similarly, if you want to do this for a specific taxonomy, you can do so as follows:

// Display all posts on XXXXXX tax Page
function sv_tax_page( $query ) {
    if ( !is_admin() && $query->is_main_query() && is_tax('project_category') ) {
        $query->set( 'posts_per_page', '-1' );
add_action( 'pre_get_posts', 'sv_tax_page' );

In both cases, the use of !is_admin is to avoid affecting the WordPress admin interface. Using $query->is_main_query ensures that no other queries are affected by this setting.

You can use this method to change other parameters for the same query as well. Here are a few examples:

$query->set( 'orderby', 'title' );
$query->set( 'order', 'DSC' );
$query->set( 'post__not_in', array(7,11) ); // Exclude Posts
$query->set( 'cat', '-1,-1257' ); // Exclude Categories
$query->set( 'cat', '153' ); // Include Categories

Feel free to refer to the Codex for various values for these parameters.

Roee Yossef
Roee Yossef

I develop custom WordPress themes by design. I love typography, colors & everything between, and aim to provide high performance, seo optimized websites with a clean & semantic code.


Leave a Comment

Add code using the buttons below. For example, to add PHP click the PHP button & add the code inside the shortcode. Typo? Please let us know...