Problem mit benutzerdefinierter WP_Query und der zugrunde liegenden Seitennummerierung / posts_per_page

In meiner Kategorievorlage (category.php) habe ich folgenden Code:

 'post', 'cat'=> $current_category->cat_ID, 'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => $posts_per_page, 'orderby' => 'date', 'order' => 'DESC' ]; // If we have posts to exclude -- add that argument if (!empty($featured_posts_to_exclude)) { $args['post__not_in'] = $featured_posts_to_exclude; } $category_posts = new WP_Query($args); if ( $category_posts->have_posts() ) : // Used in template part to vary content $loop_count = 0; /* Start the Loop */ while ( $category_posts->have_posts() ) : $category_posts->the_post(); // We use this instead of "get_template_parts" so that we can pass loop vars include(locate_template('template-parts/content-horz-ads.php', false, false)); $loop_count++; endwhile; // Add pagination im_numeric_posts_nav($category_posts); // Reset since we are using a custom loop. wp_reset_postdata(); else : get_template_part( 'template-parts/content', 'none' ); endif; 

Meine Paginierungsfunktion ist wie folgt (ich poste es der Vollständigkeit halber, aber es funktioniert absolut gut, ob posts_per_page auf 10 oder 6 gesetzt ist oder ob es eine benutzerdefinierte Schleife ist oder nicht – es zeigt die richtigen Links und die Nummer an von Links):

 function im_numeric_posts_nav($custom_query_object = null) { // If we're on a singular page, we don't need navigation if (is_singular()) { return; } // If a custom loop was passed in, use it...otherwise use global loop if ($custom_query_object !== null) { $wp_query = $custom_query_object; } else { global $wp_query; } /** Stop execution if there's only 1 page */ if ($wp_query->max_num_pages max_num_pages); /** Add current page to the array */ if ($paged >= 1) { $links[] = $paged; } /** Add the pages around the current page to the array */ if ($paged >= 3) { $links[] = $paged - 1; $links[] = $paged - 2; } if (($paged + 2) <= $max) { $links[] = $paged + 2; $links[] = $paged + 1; } echo '' . "\n"; } 

Auf Kategorienseiten mit hervorgehobenen Beiträgen ist $ posts_per_page auf 6 gesetzt. Es werden nur 6 Beiträge angezeigt. Aber … die Paginierungsabfrage denkt immer noch, dass es 10 Beiträge pro Seite gibt. Es gibt 214 Beiträge. Es sollte 35 Seiten geben … aber wenn ich auf irgendeine Seite nach Seite 22 gehe, bekomme ich eine 404. Was mir sagt, dass es immer noch die “Posts per page” benutzt, die im WordPress-Admin unter den “Reading” -Einstellungen eingestellt sind . Wenn ich das auf “6” ändere – alles ist perfekt rosig. Allerdings … Ich möchte nicht, dass der Standardwert auf 6 gesetzt wird … Ich möchte das über die Variable “posts_per_page” in der benutzerdefinierten Abfrage festlegen können. Irgendeine Idee, warum das passiert oder was ich hier falsch mache? Ich haue mir da wirklich den Kopf.

Solutions Collecting From Web of "Problem mit benutzerdefinierter WP_Query und der zugrunde liegenden Seitennummerierung / posts_per_page"

Stoppen Sie das Überschreiben der Standardschleife und verwenden pre_get_posts stattdessen pre_get_posts . So was:

 function wpse_247208_custom_category_query( $query ) { // Return early for any situation you aren't interested in. if ( is_admin() || ! $query->is_main_query() || !is_category() ) { return; } $query->set( 'posts_per_page', 6 ); // Don't use a global; create a function to populate this value // I just don't know how you created this value so I wanted to make sure // it is represented. $featured_posts_to_exclude = get_featured_posts_to_exclude(); // If we have posts to exclude -- add that argument if (!empty($featured_posts_to_exclude)) { $query->set('post__not_in', $featured_posts_to_exclude); } } add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );