Die Schleife beginnt bei einer bestimmten ID

Ist es möglich, die Schleife von einer bestimmten Post-ID aus zu starten? Ich möchte alle Post ab einer bestimmten ID abgerechnet bekommen. Um das zu erklären, muss ich zuerst einige Annahmen machen.

Angenommen, meine WordPress-database hat 20 Beiträge. Offensichtlich wird jeder Post eine ID haben und annehmen, dass die IDs für diese Posts von 1 bis 20 reichen.

Nehmen Sie außerdem an, dass beim Laden der Posts durch die Schleife standardmäßig alles verwendet wird. Die Schleife wird also Datensätze / Posts von 20 bis 1 abrufen. Wenn wir eine Bereichsbeschränkung von 10 haben, ruft Seite 1 20 bis 11 auf, und Seite 2 ruft 10 zu 1 ab.

Nun zurück zu meiner Frage. Angenommen, ich möchte die Datensätze 17 bis 8 empfangen. Kann ich irgendwie 17 in die Schleife leiten und die 10 Datensätze von 17 bis 8 abrufen? Ist das möglich?

Hier sind einige Codezeilen, um das Problem zu verstehen:

 'post', 'post_status' => 'publish', 'category_name' => 'news', 'posts_per_page' => 10, 'ID_VARIABLE_HERE' => 17 // I would like to be able to pass the ID, and the loop should return 10 posts (as defined in the posts_per_page), descendingly, starting at 17. ); $custom_query = new WP_Query($args); ?> have_posts()): while ($custom_query->have_posts()) : $custom_query->the_post() ; ?> 
<a href="https://wordpress.stackexchange.com/questions/136861/the-loop-starting-at-a-certain-id/">

Wie Sie sehen können, möchte ich ein Argument in den $args -Argumenten übergeben, das den ID-Wert haben wird (17 im obigen Beispiel). Lesen Sie den Code-Kommentar oben, um Details zu erfahren, was benötigt wird. Ist es möglich? Wenn nicht über ein Argument in $args , was ist eine andere Möglichkeit, das zu tun?

Vielen Dank.

Solutions Collecting From Web of "Die Schleife beginnt bei einer bestimmten ID"

Würde die Verwendung des offset Parameters für Ihre Bedürfnisse funktionieren?

 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'category_name' => 'news', 'posts_per_page' => 10, 'offset' => 17 ); 

Sie können etwas wie unten tun, indem Sie die Post-ID angeben, die Sie als $ max_post_id starten möchten, und absteigend bis zu einer bestimmten post_id, die als $ min_post_id bereitgestellt werden kann:

 // Get all post ids. $all_post_ids = get_posts(array( 'fields' => 'ids', // Only get post IDs 'posts_per_page' => -1 )); // Make a list of all possible post ids between two post ids. $max_post_id = 17; $min_post_id = 8; $custom_post_id = []; for ( $i = $max_post_id; $i > $min_post_id; $i-- ) { $custom_post_id[] = $i; } // Filter out the valid post ids from the possible post ids. $query_post_ids = array_intersect( $custom_post_id, $all_post_ids ); $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'category_name' => 'news', 'posts_per_page' => 10, 'post__in' => $query_post_ids // Use the valid post ids in the array. ); $custom_query = new WP_Query( $args ); if ( $custom_query->have_posts() ): while ($custom_query->have_posts()) : $custom_query->the_post() ; ?>  < ?php endwhile; else: ?> 

< ?php _e('No contents exist.'); ?>

< ?php endif;

Beachten Sie, dass dies zu einem performancesproblem führen kann, da wir eine "for" -Schleife verwenden, um mögliche IDs mit einem Dekrement von 1 zu erstellen, wenn die Lücke zwischen max und min zu groß ist.

Es gibt eine Möglichkeit, dies mit pre_get_posts und WP_Query mit einem benutzerdefinierten Parameter zu tun! 🙂

Angenommen, das sind unsere $args .

 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'category_name' => 'news', 'posts_per_page' => 10, 'maximum_id' => 17, // I choose this name for example, feel free ); 

Sie müssen den Parameter pre_get_posts im pre_get_posts Hook pre_get_posts .

 function wpse_136861_pre_get_posts($query) { if(intval($query->get('maximum_id')) > 0 && $query->get('maximum_id') >= $query->get('posts_per_page')) { $start = $query->get('maximum_id') - $query->get('posts_per_page'); // Be sure to avoid the negative / 0 value if($start < = 0) { $start = 1; } $end = $query->get('maximum_id'); $query->set('post__in', range($start, $end)); // Set your post_id array with all int beetween $start and $end (7-17 here) $query->set('orderby', 'ID'); // Set by ID DESC (DESC order is default in WP_Query) } return $query; } add_action('pre_get_posts', 'wpse_136861_pre_get_posts'); 

Das funktioniert 🙂

Sie können posts_where hook verwenden, um dies zu erreichen

 add_filter( 'posts_where' , 'posts_where' ); function posts_where( $where ) { global $wpdb; $start = $query->get('ID_VARIABLE_HERE'); // add any condition if you have if ( ! is_admin() && $query->is_main_query()){ $where .= " AND {$wpdb->posts}.ID >= $start"; } return $where; }