Paginierung mit WP_Query ist fehlerhaft - arbeitet für einige Seiten, aber nicht für die anderen

wordpress.stackexchange https://wordpress.stackexchange.com/questions/7687

  •  16-10-2019
  •  | 
  •  

Frage

Ich habe einen sehr eigenartigen Fehler mit Pagination :( Ich versuche, 4 Beiträge pro Seite für eine Kategorie mit Slug "Lastest-News" anzuzeigen.

Die Paginierungsfunktion scheint richtig zu funktionieren. Es gibt 33 Beiträge. Die Pagination wird korrekt mit 9 Seiten und Links des folgenden Formats konstruiert:/Kategorie/letztes-news/Seite //

Das Interessante ist, dass es korrekt funktioniert (mit 4 Beiträgen pro Seite) von Seite 1-4 einschließlich. Für die Seiten 5-9 funktioniert es jedoch überhaupt nicht. Es scheint nicht einmal die Vorlage zu dienen ... Der einzige Fehler, den ich erkennen könnte, ist die Seite "Nichts für die Kategorie Lastest-News Seite 5".

Ich würde verstehen, ob es überhaupt nicht funktioniert, aber für zufällig 4 Seiten und nicht mehr?

Ich würde jede Hilfe wirklich sehr schätzen! Ich habe ungefähr 4 Stunden damit verbracht, herauszufinden, was los ist, und es nervt mich.

Danke für die Hilfe :)

Ich verwende den folgenden Code für die Abfrage:

<?php 
$page = get_query_var('paged');
$posts_on_page = new WP_Query("posts_per_page=4&category_name=lastest-news&paged=".$page);

//loop to display every one of 4 posts

//pagination
pagination($posts_on_page->max_num_pages);
?>

Ich verwende die Paginierungsfunktion aus diesem Beitrag: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin

Hier ist die Funktion (die gut zu funktionieren scheint):

function pagination($pages = '', $range = 2){  
 $showitems = ($range * 2)+1;  

 global $paged;
 if(empty($paged)) $paged = 1;

 if($pages == '')
 {
     global $wp_query;
     $pages = $wp_query->max_num_pages;
     if(!$pages)
     {
         $pages = 1;
     }
 }   

 if(1 != $pages)
 {
     echo "<div class='pagination'>";
     if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>&laquo;</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo;</a>";

     for ($i=1; $i <= $pages; $i++)
     {
         if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
         {
             echo ($paged == $i)? "<span class='current'>".$i."</span>":"<a href='".get_pagenum_link($i)."' class='inactive' >".$i."</a>";
         }
     }

     if ($paged < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($paged + 1)."'>&rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>&raquo;</a>";
     echo "</div>\n";
 }
}
War es hilfreich?

Lösung

WordPress macht auf jeder Seite seine eigene Frage. Sie sollten diese Abfrage ändern, anstatt eine neue zu erstellen. Was jetzt passiert, ist, dass WordPress eine Abfrage mit den Standardbeiträgen pro Seite von 10 macht, aber Sie tun mit diesen Ergebnissen nichts und machen Ihre eigene Frage. Dies funktioniert ... bis WordPress über Post #33 hinausgeht, der sich auf Seite 4 befindet.

  1. WordPress-Abfragen 1-10, Ihre Vorlagenabfragen 1-4
  2. WordPress-Abfragen 11-20, Ihre Vorlagenabfragen 5-8
  3. WordPress-Abfragen 21-30, Ihre Vorlagenabfragen 9-12
  4. WordPress-Abfragen 31-40, Ihre Vorlagenabfragen 13-16
  5. WordPress-Abfragen 41-50, erhalten jedoch keine Ergebnisse, sodass es 404 enthält. Ihre Vorlage lädt nicht.

Daher sollten Sie stattdessen die Standardabfrage ändern, die WordPress ausführen wird, indem Sie diese in Ihr platzieren functions.php oder im Plugin:

add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
    if ( $wp_query->is_category && 'latest-news' == $wp_query->get_queried_object()->slug ) {
        $wp_query->set( 'posts_per_page', 4 );
    }
}

Andere Tipps

Basierend auf @Jan Fabry Antwort ändere ich die Syntax ein bisschen. Es funktioniert gut. Danke Jan für die Erklärung !!!

add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
  if ($wp_query->query_vars['category_name'] == 'latest-news'){
    $wp_query->query_vars['posts_per_page'] = 4;
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top