Zeigt die korrekte Anzahl von posts_per_page an, wenn die Verwendung von post__not_in vermieden wird

WordPress VIP und andere Entwicklungsleitfäden, die ich gesehen habe, empfehlen, die Verwendung von post__not_in aus performancesgründen zu vermeiden, wenn WordPress im Maßstab verwendet wird. Ihr Vorschlag ist, die Beiträge in PHP herauszufiltern:

$posts_to_exclude = [ 67, 68, 69 ]; $query = new WP_Query( [ 'post_type' => 'post', 'posts_per_page' => 5 + count( $posts_to_exclude ), 'paged' => get_query_var( 'paged' ), ] ); if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); if ( in_array( get_the_ID(), $posts_to_exclude, true ) ) { continue; } the_title(); endwhile; endif; 

Meine Frage ist, wie zeigen Sie die richtige Anzahl von Beiträgen pro Seite beim Herausfiltern der Beiträge über PHP? Im obigen Beispiel wird die Anzahl der ausgeschlossenen Posts zur Variablen posts_per_page hinzugefügt. Dies würde jedoch dazu führen, dass zwischen 5 – 8 Beiträge pro Seite vorhanden sind, abhängig davon, wie viele Beiträge für eine bestimmte Seite ausgeschlossen sind. Gibt es eine praktikable Lösung, um die Anzahl der Posts pro Seite konsistent zu machen, oder ist diese Optimierung nur für Posts gedacht, die nicht paginiert werden?

Solutions Collecting From Web of "Zeigt die korrekte Anzahl von posts_per_page an, wenn die Verwendung von post__not_in vermieden wird"

 $limit = 5; if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); if ( in_array( get_the_ID(), $posts_to_exclude, true ) && $limit > 0 ) { continue; } $limit--; the_title(); endwhile; endif; 

Wenn Sie das post_not_in und den Parameter post_not_in vermeiden post_not_in sollten Sie diesen Code hinzufügen, um posts in $query zu filtern.

 //get posts from query object $posts = $query->posts; //set limit of posts that You need on page $limit = 5; //filter by ID that You want to exclude $posts = array_filter($posts, function( $data ){ if( ! in_array( $data->ID, $posts_to_exclude ) )return true; }); $posts = array_slice($posts, 0, $limit); //put filtered posts in query object $query->posts = $posts; //here You can do Your loop