Ist es möglich, get_previous_post () zu verschachteln?

Ich versuche, das vorhergehende und das vorherige Bild des vorletzten Beitrags sowie das Bild der beiden nächsten Beiträge wiederherzustellen.

 

Anstelle der nächsten und vorherigen Links möchte ich vier vorgestellte Bilder der umliegenden Beiträge zeigen.

Solutions Collecting From Web of "Ist es möglich, get_previous_post () zu verschachteln?"

Wie ich zuvor in einem Kommentar gesagt habe

Sie verwenden ungültige Werte in get_previous_post() und get_next_post() . Sie sind hier besser, um Ihre eigene function zu schreiben

Ich habe folgendes gefunden. :

  • Holen Sie sich ein Array aller Posts und bestimmen Sie die Position des aktuellen Posts.

  • Erhalten Sie die Post-IDs der Posts auf beiden Seiten des aktuellen Posts. Die Anzahl der IDs hängt von dem von $x_from_current festgelegten $x_from_current . Der aktuelle Standardwert ist eins, was bedeutet, dass die ID neben dem aktuellen Post abgerufen wird. Wenn auf zwei gesetzt, werden zwei Posts neben dem aktuellen Post abgerufen

  • Sie haben auch die Möglichkeit, die function so einzustellen, dass die nächsten / vorherigen Beiträge vom selben Begriff wie der aktuelle Beitrag kommen. Denken Sie daran, die Taxonomie dann so gut wie standardmäßig auf category festzulegen

Ich habe beschlossen, nur die Post-IDs der angrenzenden Posts zurückzugeben, da Sie Thumbnails anzeigen müssen. In diesem Fall benötigen Sie nur Post-IDs

Hier ist die function. Ich habe es gut kommentiert, damit Sie verstehen können, wie die function funktioniert und wie sie funktioniert

 function get_x_post_from_current( $x_from_current, $in_same_term, $taxonomy, $previous ) { // Get the current single post ID. To be save, use get_queried_object_id() $current_post_id = get_queried_object_id(); // Option to choose if adjacent posts should be from the same term. Should then set $taxonomy if( true === $in_same_term ) { /** * Use wp_get_post_terms() to retrieve the terms/categories the current post belongs * to * * @see http://codex.wordpress.org/Function_Reference/wp_get_post_terms * */ $terms = wp_get_post_terms( $current_post_id, $taxonomy, ['fields' => 'ids'] ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ /** * Use tax_query to retrieve a list of posts from the same term as the current post. * To speed up the query, get only post ID's. We don't need any other field's info * * @see http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters */ $args = [ 'posts_per_page' => -1, 'fields' => 'ids', 'tax_query' => [ [ 'taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => $terms[0], 'include_children' => false, ] ] ]; } }else{ // Default if $in_same_term is false $args = [ 'posts_per_page' => -1, 'fields' => 'ids' ]; } $q = new WP_Query( $args ); // Get the current post position. Will be used to determine adjacent posts $current_post_position = array_search( $current_post_id, $q->posts ); /** * Previous posts = Newer posts * Next Posts = Older posts * * If $previous is true, reverse array, use array_slice to get the desired amount * of ID's on the left of the current post. Reverse that array to keep synchronous order * * If $previous is false, slice the array to the right of the current post * */ if( true === $previous ) { $reverse_position = count( $q->posts ) - ( $current_post_position + 1 ); $array_reverse = array_reverse( $q->posts ); $keys = array_slice( $array_reverse, $reverse_position + 1, $x_from_current ); }else{ $keys = array_slice( $q->posts, $current_post_position + 1, $x_from_current ); } // Returns an array of post ID's or an empty string if no next/previous post is found return $keys; } // Get the previous post's ID's. Amount of ID's to retrieve is set by $x_from_current function get_previous_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = 'category' ) { return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, true ); } // Get the next post's ID's. Amount of ID's to retrieve is set by $x_from_current function get_next_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = 'category' ) { return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, false ); } 

So sollten Sie die functionen in Ihrer single.php verwenden. In deinem Fall brauchst du zwei Beiträge auf beiden Seiten (nächste / vorherige Beiträge)

 $previous_posts = get_previous_x_post_id( 2 ); ?>
< ?php var_dump($previous_posts); ?>

< ?php // Just to see the output if( $previous_posts ) { foreach ( $previous_posts as $previous_post ) { // $previous_post holds the post ID. Use $previous_post to return the post thumbnail //Get the post title $get_post = get_post( $previous_post ); echo apply_filters( 'the_title', $get_post->post_title ); } }

Mach dasselbe für die nächsten Posts.

Das ist nur das Minimum. Sie können es erweitern, wie Sie es für richtig halten. Sie können sich auch diesen Beitrag ansehen, den ich kürzlich gemacht habe. Dies ist eine ziemlich umfangreiche function zur Post-Paginierung, die bei Bedarf Referrer und mehrere Post-Typen verwendet. Sie können diese functionalität sehr einfach dort einbauen

EDITS nach den Kommentaren

Zum Beispiel möchte ich sie von links nach rechts so, 1,2,4,5. Aber jetzt ist es in 2,1,5,4 bestellt und ich will sie nicht umdrehen

Im ursprünglichen Code, aus einem unbekannten Grund, ging ich und kehrte das zurückgegebene Array von Post-IDs für vorherige Beiträge. Das ist jetzt behoben (oder nach Wissen kann ich leider jetzt nichts mehr testen)

Ich möchte den Titel unter der Miniatur hinzufügen, kann ich die Felder zu IDs und Titel ändern?

Es gibt keine Option, nur Posttitel zurückzugeben. Die beste Arbeit hier wäre, die Post-IDs zu verwenden, die von der function zurückgegeben wird, und sie mit get_post zu verwenden, um den bestimmten Post zu erhalten und von dort den Titel des get_post zu verwenden.

Es wäre sehr teuer, die function selbst zu ändern, um dies zu berücksichtigen, da Sie alle Beiträge vollständig abrufen müssen, und wenn Sie über tausend Beiträge verfügen, besteht die Gefahr, dass Sie das Zeitlimit überschreiten. Deshalb ging ich mit der Idee, nur alle Post-IDs zu bekommen, da dies schnell und nicht sehr teuer ist. Es ist auch viel besser, vier kleine db-Abfragen zu machen, um die vier relevanten Post-Infos zu erhalten

Bitte beachten Sie den Code oben für die aktualisierten Versionen

Der Trick ist, dass diese function nur für den aktuellen Post funktioniert. Aber das können Sie anpassen.

Im Prinzip sollte also so etwas funktionieren (nicht getestet):

 global $post; $post = get_next_post(); setup_postdata( $post ); // the next is now current // do things $post = get_next_post(); // and this time we got the next for next // do more things wp_reset_postdata(); // clean up when we are done