Wie man einige Posts zuerst in der Schleife basierend auf Post-ID auflistet

Ich habe eine Abfrage, um einige Beiträge anzuzeigen.

$args = array( 'post_type' =>'products' 'posts_per_page'=> 12, 'orderby' => 'meta_value_num', 'meta_key' => '_price', 'order' => 'asc', ); $loop=new WP_Query($args); while($loop->have_posts()) : $loop->the_post(); the_content(); endwhile; 

In dieser Schleife bekomme ich die Produkte, aber ich muss zuerst einige Produkte in dieser Schleife erscheinen. 12,13,14,34 das sind meine Post-ID, die ich zuerst in der Schleife erscheinen muss.

Wie kann ich diesen Beitrag zuerst anzeigen und die anderen ausruhen? . Gibt es einen Weg dies zu tun? Wenn eine Variable in den Argumenten von $ diese Art von functionalität unterstützt?

Solutions Collecting From Web of "Wie man einige Posts zuerst in der Schleife basierend auf Post-ID auflistet"

Wenn du musst:

  • Seite die Abfrage

  • Behalte 12 Beiträge pro Seite bei, anstatt die gewünschten Beiträge auf die benötigten 12 zu “kleben”

  • Sie müssen diese Beiträge nur auf der ersten Seite anzeigen

Sie können Folgendes versuchen

 $ids_args = [ 'post_type' => 'products' 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => '_price', 'order' => 'ASC', 'fields' => 'ids' ]; $all_posts_ids = get_posts( $ids_args ); // Make sure we have posts before continuing if ( $all_posts_ids ) { // Set all our posts that should move to the front $move_to_front = [12,13,14,34]; // Add the array of posts to the front of our $all_posts_ids array $post_ids_merged = array_merge( $move_to_front, $all_posts_ids ); // Make sure that we remove the ID's from their original positions $reordered_ids = array_unique( $post_ids_merged ); // Now we can run our normal query to display 12 posts per page $args = [ 'post_type' => 'products' 'posts_per_page' => 12, 'post__in' => $reordered_ids, 'orderby' => 'post__in', 'order' => 'ASC', 'paged' => get_query_var( 'paged', 1 ), ]; $loop = new WP_Query( $args ); while( $loop->have_posts() ) { $loop->the_post(); the_content(); } wp_reset_postdata(); } 

Wenn Sie diese Beiträge brauchen

  • um auf den 12 Posts auf jeder Seite zu bleiben

  • in einer seitenweisen Abfrage

Sie können zwei Abfragen wie folgt ausführen

 // Set an array of id's to display in front $move_to_front = [12,13,14,34]; // Run the query to display the posts you need in front $args_front = [ 'post_type' => 'products' 'posts_per_page' => count( $move_to_front ), 'post__in' => $move_to_front, 'orderby' => 'meta_value_num', 'meta_key' => '_price', 'order' => 'ASC', ]; $loop_front = new WP_Query( $args_front ); if( $loop_front->have_posts() ) { while( $loop_front->have_posts() ) { $loop_front->the_post(); the_content(); } wp_reset_postdata(); } // Now we can run our major loop to display the other posts $args = [ 'post_type' => 'products' 'posts_per_page' => 12, 'post__not_in' => $move_to_front, 'orderby' => 'meta_value_num', 'meta_key' => '_price', 'order' => 'ASC', 'paged' => get_query_var( 'paged', 1 ), ]; $loop = new WP_Query( $args ); if( $loop->have_posts() ) { while( $loop->have_posts() ) { $loop->the_post(); the_content(); } wp_reset_postdata(); } 

Wenn Sie nur eine Seite mit diesen Posts benötigen, dann ist die Lösung von @birgire die richtige Lösung

Wir könnten das mit zwei Abfragen tun:

Zuerst holen wir die Post-IDs, die wir brauchen, mit der ersten Abfrage und dann verbinden wir sie mit unseren Sticky-Post-IDs und füttern sie in die zweite Abfrage mit dem Parameter post__in zum Filtern und Ordnen:

 $args = [ 'post_type' => 'products' 'posts_per_page' => 12, 'orderby' => 'meta_value_num', 'meta_key' => '_price', 'order' => 'asc', 'ignore_sticky_posts' => true, 'fields' => 'ids', ]; $ids = get_posts( $args ); if( ! empty( $ids ) ) { $stickies = [12,13,14,34]; $post__in = array_unique( array_merge( $stickies, $ids ) ); $args = [ 'post__in' => $post__in, 'orderby' => 'post__in', 'ignore_sticky_posts' => true, ]; $loop = new WP_Query( $args ); // ... etc } 

Wo passen wir die $stickies für die benutzerdefinierten klebrigen Beiträge.

Birgires Lösung funktionierte für mich nicht so wie sie ist. Ich musste einen post_type‍ in meinen Argumenten nach dem Sortieren angeben.

Hier sind meine Modifikationen, als class gebaut.

 class locations{ public function __construct(){ $this->args = [ 'post_type' => 'location', 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'asc', 'fields' => 'ids', 'ignore_sticky_posts' => true, ]; $this->ids = get_posts($this->args); $this->get = new WP_Query($this->sort_ids()); } //Sorts the locations by specified criteria private function sort_ids(){ $stickies = [2071,2080,2069,1823]; $post__in = array_unique(array_merge($stickies, $this->ids)); $args = [ 'post_type' => 'location', 'post__in' => $post__in, 'orderby' => 'post__in', 'order' => 'asc', 'posts_per_page' => -1, 'ignore_sticky_posts' => true, ]; return $args; } }