每页的WordPress帖子(存档)

i have a custom post type and would like to change the number of posts per page. i use the following code to show/limit the posts:

    $args = array(
        'post_type' => 'movie',
        'posts_per_page' => 3,
        'tax_query' => array(
            array(
              'taxonomy' => $wp_query->queried_object->taxonomy,
              'field' => 'slug',
              'terms' => $wp_query->queried_object->slug,
            )
        ),
        'paged' => get_query_var('paged') ? get_query_var('paged') : 1
    );
    query_posts( $args );

for this time i have 20 posts with this post type and the default posts per page in wordpress admin (settings/read ...) is set to 10.

if i call the url without a page it shows 3 posts, if i call the url with "page/2/" it shows 3 posts but if i call the page with "page/3/" it shows nothing found ...

i wouldn't change the default value for the posts in the admin - does someone have a idea?

note: to "debug" i let me show the value for "$wp_query->post_count;" - this use the default admin posts per page - 10 ...

regards kai

When you load the page, it will do a query before the template file (archive.php) is called.

That first query will use the defaults set in WordPress; ie. 10 posts per page. By the sounds of things, you're running that second 'query_posts' call within archive.php, but it sounds like that is after you have run the appropriate checks.

Two possible solutions for you:

  1. Modify the first query with the posts_per_page

    add_filter( 'pre_get_posts', 'modify_movie_query' );
    
    function modify_movie_query( $wp_query ) {
        if( $wp_query->query_vars['post_type'] != 'movie' ) return;
        $wp_query->query_vars['posts_per_page'] = 3;
    }
    

    Because you have modified a reference to $wp_query, you don't need to return it.

  2. Run the query_posts call at the top of the archive.php template

Option 1 is what I would recommend - it's the most efficient, and the most appropriate.

The approved answer doesn't really work if the archive page is for a custom taxonomy. In that case, you might want to use the following:

add_filter( 'pre_get_posts', 'modify_movie_query' );

function modify_movie_query( $wp_query ) {
  if(is_tax('movie-category')){
    $wp_query->query_vars['posts_per_page'] = 10;
  }
  return $wp_query
}