it-swarm.com.de

Gebrochene Paginierung

Nun, ich bin wieder hier und habe fast das gleiche Problem wie vor drei Wochen in diesem Post , aber lassen Sie mich erklären, was seitdem passiert ist:

Ich habe ursprünglich eine Schleife verwendet, um den neuesten Sticky-Post oben auf der Startseite anzuzeigen, dann eine zweite Schleife, um alle anderen Posts anzuzeigen (mit Ausnahme aller anderen Stickies). Hier ist mein Code wie er jetzt ist:

// first loop to display only my single, MOST RECENT sticky post
$sticky = get_option('sticky_posts');
$wp_query = new WP_Query(array('post__in' => $sticky, 'caller_get_posts' => 1, 'orderby' => ID, 'showposts' => 1)); ?>
<?php while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endwhile; wp_reset_query(); ?>

// second loop to display every other post, excluding sticky posts
<?php query_posts(array('post__not_in' => get_option('sticky_posts'))); // exclude all sticky posts ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endif; wp_reset_query(); ?>

Was hier passiert, ist perfekt ... nur für die Titelseite. Ich bekomme ganz oben meinen Nizza Single/letzten Sticky Post, gefolgt von weiteren 5 Posts. Wenn ich auf die Seiten 2, 3, 4 usw. gehe, sehe ich leider nur die gleichen 5 Beiträge, die sich unter dem klebrigen Beitrag auf der Titelseite befanden!

Ich bin ziemlich neu mit dem Konzept der Mehrfachschleifen, also könnte ich hier wirklich eine Hand gebrauchen!

Danke im Voraus :)

2
user6674

Ich sehe ein paar Probleme, die wahrscheinlich zu Ihrem Problem beitragen:

  1. Verwenden Sie query_posts() immer nur, um die primäre Schleife zu ändern.
  2. Der Parameter caller_get_posts wurde zugunsten von ignore_sticky_posts verworfen
  3. Die Variable $wp_query ist eine definierte globale Variable. Die Verwendung außerhalb des bestimmungsgemäßen Gebrauchs kann zu unbeabsichtigten Umständen führen.

Zunächst müssen Sie also feststellen, welches Ihre primäre Schleife ist. Ich gehe davon aus, dass dies die zweite Schleife ist.

Als zweites müssen Sie einen eindeutigen, beschreibenden Namen für Ihre sekundäre Schleife (d. H. Ihre erste Schleife) angeben, z. B. $most_recent_sticky_post.

Das sollte dich verlassen mit:

<?php
// Get IDs of sticky posts
$sticky = get_option('sticky_posts');
// first loop to display only my single, 
// MOST RECENT sticky post
$most_recent_sticky_post = new WP_Query( array( 
    // Only sticky posts
    'post__in' => $sticky, 
    // Treat them as sticky posts
    'ignore_sticky_posts' => 0, 
    // Order by ID
    'orderby' => ID, 
    // Get only the one most recent
    'showposts' => 1
) );
while ( $most_recent_sticky_post->have_posts() ) : $most_recent_sticky_post->the_post(); ?>
    <!-- loop code -->
<?php endwhile; wp_reset_query(); ?>

// second loop to display every other post, 
// excluding sticky posts
<?php 
query_posts( array( 
    // exclude all sticky posts
    'post__not_in' => get_option( 'sticky_posts' ) 
) );  
if (have_posts()) : while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endif; wp_reset_query(); ?>

Da Sie jetzt nicht mehr auf $wp_query herumstampfen, sollte Ihre Paginierung ordnungsgemäß funktionieren.

Bearbeiten

Okay, andere Dinge:

  1. Der Parameter showposts ist und veraltet. Verwenden Sie stattdessen post_per_page.
  2. Lassen Sie uns versuchen , eine Zusammenführung von Abfragevariablen für Ihre Primärschleife durchzuführen.

z.B.:

// Define custom query args
$custom_query_args = array( 
    // exclude all sticky posts
    'post__not_in' => get_option( 'sticky_posts' ) 
);  
// globalize $wp_query
global $wp_query;
// Merge custom args with default query args
$merged_query_args = array_merge( $wp_query->query, $custom_query_args );
// process the query
query_posts( $merged_query_args );

Ich weiß nicht, dass dies einen Unterschied machen wird, aber ich bevorzuge es, die Standardabfrage mit dieser Methode zu ändern.

  1. Wenn dies immer noch nicht funktioniert, erzwingen Sie query_posts(), um sich daran zu erinnern, dass Paging verwendet werden soll. Fügen Sie 'paged' => get_query_var('paged') zu Ihrem $custom_query_args-Array hinzu:

z.B.

  // Define custom query args
  $custom_query_args = array( 
      // exclude all sticky posts
      'post__not_in' => get_option( 'sticky_posts' ),
      // don't forget to paginate!
      'paged' => get_query_var('paged')
  );  

Wo bringt uns das hin?

2
Chip Bennett

Sollten Sie keine Paging-Parameter in Ihrer WP_Query verwenden?

 $posts = new WP_Query( array( /*your args here*/, 'paged' => get_query_var( 'page' ) ) );

Es könnte get_query_var ('paged') sein, abhängig von der WP Version, die ich glaube.

WP_Query Paginierungsparameter hier

0
Shane