Wie bekomme ich Post-IDs in den pre_get_posts Filter?

Ich versuche, diese zu tun: Auf der Startseite (Titelseite) habe ich mehrere Beiträge Schleifen. Ich brauche Beiträge, die über diese Schleifen hinweg nicht wiederholt werden (dh wenn der Beitrag in der ersten Schleife angezeigt wurde, sollte er nie in der 2. oder 3. Stelle usw. erscheinen).

Ich komme auf diese (niedriger), aber meine Lösung erfordert, dass ich 2 mal für jede Schleife abfrage (also wenn ich 3 Schleifen habe, mache ich 6 db Anfragen), das ist irgendwie schlecht.

Also meine Frage ist: Kann ich Posts IDs im pre_get_posts Filter bekommen.

Mein Code bisher:

 /** Hack to exclude repeating of posts */ if( ! function_exists( 'jews_exclude_shown_posts' ) ) { function jews_exclude_shown_posts( $query ) { if( is_admin() ) return $query; if( $query->is_main_query() ) { $GLOBALS['jews_exclude'] = array(); } elseif ( false !== $query->query_vars['jews_exclude'] && ( null === $query->query_vars['post_type'] || ( is_array( $query->query_vars['post_type'] ) && in_array( 'post', $query->query_vars['post_type'] ) ) || 'post' === $query->query_vars['post_type'] ) ) { if( ! empty( $GLOBALS['jews_exclude'] ) ) { $query->set('post__not_in', $GLOBALS['jews_exclude']); } $args = $query->query; $args['jews_exclude'] = false; $execute = new WP_query( $args );//here i do dubble query witch i dont't want to do if( $execute->have_posts() ) { foreach( $execute->posts as $ex ) $GLOBALS['jews_exclude'][ $ex->ID ] = $ex->ID; } } return $query; } } add_filter( 'pre_get_posts', 'jews_exclude_shown_posts' ); 

Solutions Collecting From Web of "Wie bekomme ich Post-IDs in den pre_get_posts Filter?"

Wir könnten versuchen, den the_posts Filter zu verwenden, der auf die abgefragten Beiträge angewendet wird, wenn die the_posts suppress_filters false ist, um relevante Post-IDs zu sammeln.

Wir können dann den Haken pre_get_posts in jeder Abfrage verwenden, um das angesammelte Array von Post-IDs auszuschließen.

Hier ist ein Schemabeispiel für den process:

 // Main query $wp_query = new WP_Query( $args ); $wp_query->posts filtered and collected post IDs [1,2] from the 'post' post type // Sub query #1 $q1 = new WP_Query( [ 'wpse_exclude' => true, ... ] ); pre_get_posts excludes accumulated [1,2] $q1->posts filtered and collected [3,4] // Sub query #2 $q2 = new WP_Query( [ 'wpse_exclude' => true, ... ] ); pre_get_posts excludes accumulated [1,2,3,4] $q2->posts filtered and collected [5,6] // Sub query #3 $q3 = new WP_Query( $args ); No exclusion because 'wpse_exclude' argument is missing $q3->posts filtered and collected [7] // Sub query #4 $q4 = new WP_Query( [ 'wpse_exclude' => true, ... ] ); pre_get_posts excludes accumulated [1,2,3,4,5,6,7] $q4->posts filtered and collected [8,9] 

Hier sind mögliche Bausteine ​​für eine Demo-class, die dabei helfen könnten:

Die Methode init() :

 public function init( $collect_post_type = 'post' ) { // Collect post IDs add_filter( 'the_posts', [ $this, 'the_posts' ] ); // Exclude accumulated post IDs in queries add_action( 'pre_get_posts', [ $this, 'pre_get_posts' ] ); // Initialize accumulated post IDs for exclusion $this->exclude_pids = []; // Collect post IDs only from this post type $this->collect_post_type = $collect_post_type; } 

Die pre_get_posts() Methode:

 public function pre_get_posts( \WP_Query $q ) { if( $q->is_home() // Target the home page && $q->get( 'wpse_exclude' ) // Target queries with wpse_exclude set as true // && ... etc ) { // Exclude accumulated set of post IDs if( ! empty( $this->exclude_pids ) ) $q->set( 'post__not_in', $this->exclude_pids ); } } 

Hier sollten wir auch erwägen, alle vorherigen post__not_in Argumente post__not_in .

Die the_posts() Methode:

 public function the_posts( array $posts ) { // Collect post IDs from 'post' post type and merge to the $pids array $this->exclude_pids = array_merge( $this->exclude_pids , (array) wp_filter_object_list( $posts, [ 'post_type' => $this->collect_post_type ], 'AND', 'ID' ) ); return $posts; } 

Ich hoffe, Sie können dies Ihren Bedürfnissen anpassen.