Zeigen Sie 4 chronologische Posts an, die mit einem zufälligen Post beginnen

Ich weiß, dass ich 4 zufällige Beiträge anzeigen kann, indem ich Folgendes mache:

get_posts('orderby=rand&numberposts=4'); 

Was ich versuche zu erreichen, ist mit einem zufälligen Gegenstand zu beginnen, aber dann die nächsten 3 Beiträge in chronologischer Reihenfolge zu zeigen.

Ich denke an etwas Ähnliches:

 $posts = get_posts('orderby=rand&numberposts=1'); foreach($posts as $post) { the_title(); //get next 3 chronological posts and loop } 

Ich denke, ich muss etwas wie den Parameter ‘offset’ verwenden, aber mit einer Post-ID anstelle einer Position?

Solutions Collecting From Web of "Zeigen Sie 4 chronologische Posts an, die mit einem zufälligen Post beginnen"

Für einen zufälligen Offset könnten wir versuchen:

 $ppp = 4; $total = wp_count_posts()->publish; $offset = $total < $ppp ? 0 : rand( 0, $total - $ppp ); $posts = get_posts( [ 'posts_per_page' => $ppp, 'offset' => $offset ] ); 

Beispiel:

Nehmen wir $ppp als 4 und nehmen wir an, dass $total 6 ist.

Dann gibt es drei Möglichkeiten für den $offset , nämlich 0, 1 und 2:

 Nr Offset Selections 1 0 x 2 1 xx 3 2 xxx 4 3 xxx 5 4 xx 6 5 x 

damit

 $offset = $total < $ppp ? 0 : rand( 0, $total - $ppp ); 

Würde geben:

 $offset = rand( 0, 6 - 4 ); 

oder nur

 $offset = rand( 0, 2 ); 

Hier ist ein anderer Ansatz, der eine date_query .

  • Wir werden den einen zufälligen Beitrag bekommen

  • Wir werden dann eine date_query , um die anderen 3 Posts zu diesem einen zufälligen Post zu bekommen

Hier ist die function, die wir verwenden werden: ( HINWEIS: Ich habe den Code kommentiert, um es einfach zu machen, und der Code benötigt PHP 5.4+)

 function get_random_posts( $args = [], $direction = 'after' ) { /** * Lets first get our random post, then work from there. We will be using the same * exact arguments for all our queries we need to run. We do however need to modify * some a bit. We will save the default args to a another variable and then modify * the args to pass to the first query. * * We will let WP_Query handle the sanitation and validation from the * array of arguments. */ $random_args = $args; $random_args['orderby'] = 'rand'; $random_args['posts_per_page'] = 1; $random_post = get_posts( $random_args ); /** * We will o get the adjacent posts from the random one. We will be * using the default $args again * * We will need to sort out the amount of posts to get from the adjacent * post query first before we go along. We need to deduct one from the amount * of posts to adjust for the random post */ if ( isset( $args['posts_per_page'] ) ) { $args['posts_per_page'] = ( $args['posts_per_page'] - 1 ); } else { $args['posts_per_page'] = ( get_option( 'posts_per_page' ) - 1 ); } // Create our date query to get the adjacent posts $date_query = [ [ $direction => $random_post[0]->post_date, 'inclusive' => false ] ]; $args['date_query'] = $date_query; // Set the order parameter according to direction if ( $direction === 'after' ) { $args['order'] = 'ASC'; } else { $args['order'] = 'DESC'; } $adjacent_query = get_posts( $args ); // Merge and return the posts return array_merge( $random_post, $adjacent_query ); } 

Wie Sie sehen können, ist der erste Parameter in der function $args . Dies wird ein Array von Argumenten sein, die Sie normalerweise an WP_Query . Der zweite Parameter $direction ist die Richtung der benachbarten Posts, entweder before oder after Bedarf.

Sie würden die function wie folgt verwenden:

 $args = [ 'posts_per_page' => 4 // The amount of posts to get // Any other arguments you might need ]; $q = get_random_posts( $args ); foreach ( $q as $post ) { setup_postdata( $post ); the_title(); } wp_reset_postdata();