kulturbanause Blog

Responsive Design, WordPress, Konzeption, HTML, CSS, JS & UX/UI …

WordPress: WP_Query mit Pagination

Wenn ihr in WordPress einen individuellen Loop mit Pagination erstellen wollt, kommt es leicht zu einer fehlerhaften Berechnung der Seitenzahlen. Das Problem hängt häufig mit dem Argument posts_per_page innerhalb eines WP_Query zusammen. In diesem Beitrag archivieren wir ein Snippet das die fehlerhafte Berechnung korrigiert, und es euch ermöglicht, die Anzahl der dargestellten Beiträge sowohl über den Code als auch über das Backend zu steuern.

Workshops und Seminare von kulturbanause

Unsere Seminar-Termine für 2018 sind online!

Visual Prototyping, Responsive Design, WordPress, Adobe Muse, HTML & CSS, Website-Optimierung …

Jetzt Frühbucher-Preise sichern!

Problem mit Pagination im WP_Query beheben

Um mögliche Probleme mit einer fehlerhaften Berechnung der Pagination im WP_Query zu beheben, benötigt ihr drei Argumente, die in Variablen ausgelagert werden. In unserem Fall sind das die Variablen $paged, $offset und $count.

$paged
Die Variable $paged gibt an, auf welcher Seite der Pagination sich der Anwender befindet.
$count
Die Variable $count legt fest, wie viele Beiträge pro Seite angezeigt werden sollen. Es kann entweder eine Zahl oder die Angabe get_option('posts_per_page', $default) zugewiesen werden. Letzteres liefert die im Backend unter »Einstellungen → Lesen« eingestellte Zahl. Die »10« im Code-Beispiel steht für den Standardwert ($default). Weitere Details zu get_option erfahrt ihr im WordPress Codex.
$offset
Mit der Variable $offset berechnet ihr, um wie viele Beiträge der Loop verschoben werden soll.  Da diese Berechnung sich aus den anderen beiden Variablen zusammensetzt, behebt ihr somit die fehlerhafte Berechnung in der Pagination.

Das folgende Snippet für einen benutzerdefinierten Loop mit Pagination kann als Grundlage verwendet werden:

<?php

  $count = get_option('posts_per_page', 10);
  $paged = get_query_var('paged') ? get_query_var('paged') : 1;
  $offset = ($paged - 1) * $count;

  $args = array (
     'posts_per_page' => $count,
     'paged' => $paged,
     'offset' => $offset,
  );

  $kb_custom_query = new WP_Query($args);
      if ($kb_custom_query->have_posts()) :
        while ($kb_custom_query->have_posts()) : $kb_custom_query->the_post();
          the_title();
          the_content();
        endwhile;
          previous_posts_link('Zurück', $kb_custom_query->max_num_pages);
          next_posts_link('Weiter', $kb_custom_query->max_num_pages);
      else :
        // Keine Beiträge gefunden
      endif;

wp_reset_postdata(); ?>

Jetzt bist du gefragt!

Hast du Anregungen, Ergänzungen, einen Fehler gefunden oder ist dieser Beitrag nicht mehr aktuell? Dann freuen wir uns auf deinen Kommentar.

Du kannst diesen Beitrag natürlich auch weiterempfehlen. Wir sind dir für jede Unterstützung dankbar!

Unterstützung bei WordPress-Projekten

Unsere WordPress Agentur ist auf die Entwicklung maßgeschneiderter WordPress-Themes und -Websites spezialisiert. Wenn du Unterstützung bei der Planung, Gestaltung und Entwicklung eines Projekts benötigst, helfen wir gerne weiter.
WordPress-Leistungsangebot →

Das könnte dich auch interessieren

1 Kommentar

  1. Selma

    Verfasst am 8. November 2017 um 16:46 Uhr.

    Sollte man mit the_posts_pagination() die Pagination erzeugen wollen, funktioniert das leider nicht so wirklich.
    Diese Funktion (und eigentlich auch alle anderen Funktionen von WordPress für die Linksnavigation von Beiträgen) bezieht sich immer auf den Main-Query von WordPress. (https://wordpress.stackexchange.com/questions/120407/how-to-fix-pagination-for-custom-loops/120408#120408 -> „Using Custom Query Object for Pagination Functions“)

    Mir ist der Fehler aufgefallen, weil ich durch meinen Custom-Query nicht die gleiche Anzahl von Beiträgen hatte wie im Main-Query und die Navigation eine Seite 3 angezeigt hat, die nicht existiert.

Kommentar verfassen

Dieser Blog lebt vom Feedback der Besucher! Also los, mach mit!
Bitte habe Verständnis dafür, dass Kommentare die mit dem Inhalt dieses Beitrags nichts zu tun haben, gelöscht werden.